springIOC以及DI概念介绍
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1"> <display-name>Spring</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> <!-- 让Spring随着项目的启动而启动 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- 配置Spring配置文件位置 --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param>
<!-- struts启动 --> <filter> <filter-name>Struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>Struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app>
① XML配置方式:
使用applicationContext.xml配置bean进行注入
<!-- bean标签属性 --> ● name:bean标识名字 - 可以重复、可以使用特殊字符; ● class:类的完整类名; ● scope: ① singleton:单例(大多数) - 创建spring容器的时候,就会立即创建这个单利对象; ② prototype:多例(极个别) - 每次获得这个对象的时候才会去创建,而且每次创建的都是新的; ● init-method:负责初始化; ● destory-method:负责销毁; ● property:set注入方式
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xmlns:context="http://www.springframework.org/schema/context" 5 xmlns:aop="http://www.springframework.org/schema/aop" 6 xmlns:tx="http://www.springframework.org/schema/tx" 7 xsi:schemaLocation="http://www.springframework.org/schema/beans 8 http://www.springframework.org/schema/beans/spring-beans.xsd 9 http://www.springframework.org/schema/context 10 http://www.springframework.org/schema/context/spring-context.xsd 11 http://www.springframework.org/schema/aop 12 http://www.springframework.org/schema/aop/spring-aop.xsd 13 http://www.springframework.org/schema/tx 14 http://www.springframework.org/schema/tx/spring-tx.xsd"> 15 16 <!-- 配置Action --> 17 <bean name="userAction" class="com.sikiedu.web.UserAction" scope="prototype"> 18 <property name="userService" ref="userService"></property> 19 </bean> 20 21 <!-- 配置Service --> 22 <bean name="userService" class="com.sikiedu.service.UserService"> 23 <property name="userDao" ref="userDao"></property> 24 </bean> 25 26 <!-- 配置Dao --> 27 <bean name="userDao" class="com.sikiedu.dao.UserDao"></bean> 28 29 </beans>
② Spring注解配置:
在三层架构中使用注解代替xml配置
● web类注解 @Controller("userAction"); @Scope(scopeName="prototype"); ● service类注解 @Service("userService"); ● dao类注解 @Repository("userDao");
● 属性注解 - 一般使用Resource
@Autowired() // 根据类自动装配; 问题:如果匹配到多个类型一致的对象,将无法注入;
@Qualifier("userService") // 根据名字自动装配;
@Resource(name = "userService") // 推荐使用,Autowired+Qualifier的结合体 ;
1 package com.sikiedu.web; 2 3 import javax.annotation.Resource; 4 5 import org.springframework.context.annotation.Scope; 6 import org.springframework.stereotype.Controller; 7 8 import com.opensymphony.xwork2.ActionContext; 9 import com.opensymphony.xwork2.ActionSupport; 10 import com.opensymphony.xwork2.ModelDriven; 11 import com.sikiedu.domain.User; 12 import com.sikiedu.service.UserService; 13 14 // 等于 <bean name="userAction" class="com.sikiedu.web.UserAction" scope="prototype"> 15 @Controller("userAction") 16 @Scope(scopeName = "prototype") 17 public class UserAction extends ActionSupport implements ModelDriven<User> { 18 19 // @Autowired() // 1-根据类自动装配; 问题:如果匹配到多个类型一致的对象,将无法注入 20 // @Qualifier("userService") // 根据名字自动装配 21 @Resource(name = "userService") // Autowired + Qualifier = @Resource,结合体 22 private UserService userService; 23 public User user = new User(); 24 25 public String login() throws Exception { 26 27 System.out.println("UserAction...run..." + userService); 28 User temp = userService.findUser(user); 29 if (temp != null) { 30 ActionContext.getContext().getSession().put("user", temp); 31 return "toIndex"; 32 } else { 33 ActionContext.getContext().put("error", "用户名或密码错误!!!"); 34 return "login"; 35 } 36 37 } 38 39 @Override 40 public User getModel() { 41 return user; 42 } 43 44 public UserService getUserService() { 45 return userService; 46 } 47 48 public void setUserService(UserService userService) { 49 this.userService = userService; 50 } 51 52 }
1 package com.sikiedu.service; 2 3 import javax.annotation.Resource; 4 5 import org.hibernate.Transaction; 6 import org.springframework.stereotype.Service; 7 8 import com.sikiedu.dao.UserDao; 9 import com.sikiedu.domain.User; 10 import com.sikiedu.utils.HibernateUtils; 11 12 // 等于 <bean name="userService" class="com.sikiedu.service.UserService"> 13 @Service("userService") 14 public class UserService { 15 16 // @Autowired() // 根据类自动装配 17 // @Qualifier("userDao") // 根据名字自动装配 18 @Resource(name = "userDao") // Autowired + Qualifier = @Resource,结合体 19 private UserDao userDao; 20 21 public User findUser(User user) { 22 23 System.out.println("UserService...run..." + userDao); 24 25 Transaction transaction = HibernateUtils.getCurrentSession().beginTransaction(); 26 User temp = null; 27 try { 28 temp = userDao.findUser(user); 29 } catch (Exception e) { 30 transaction.rollback(); 31 } 32 transaction.commit(); 33 34 return temp; 35 } 36 37 public UserDao getUserDao() { 38 return userDao; 39 } 40 41 public void setUserDao(UserDao userDao) { 42 this.userDao = userDao; 43 } 44 45 }
1 package com.sikiedu.dao; 2 3 import org.hibernate.Session; 4 import org.hibernate.query.NativeQuery; 5 import org.springframework.stereotype.Repository; 6 7 import com.sikiedu.domain.User; 8 import com.sikiedu.utils.HibernateUtils; 9 10 // 等于 <bean name="userDao" class="com.sikiedu.dao.UserDao"></bean> 11 @Repository("userDao") 12 public class UserDao { 13 14 public User findUser(User user) { 15 16 System.out.println("userDao...run..." + user); 17 18 Session session = HibernateUtils.getCurrentSession(); 19 String sql = "SELECT * FROM user WHERE username = ? AND password = ?"; 20 21 NativeQuery<User> sqlQuery = session.createSQLQuery(sql); 22 sqlQuery.setParameter(1, user.getUsername()); 23 sqlQuery.setParameter(2, user.getPassword()); 24 sqlQuery.addEntity(User.class); 25 26 User temp = sqlQuery.uniqueResult(); 27 28 return temp; 29 } 30 31 }
配置applicationContext.xml,spring会自动扫描com.xxx包下面有注解的类,完成Bean的装配。
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xmlns:context="http://www.springframework.org/schema/context" 5 xmlns:aop="http://www.springframework.org/schema/aop" 6 xmlns:tx="http://www.springframework.org/schema/tx" 7 xsi:schemaLocation="http://www.springframework.org/schema/beans 8 http://www.springframework.org/schema/beans/spring-beans.xsd 9 http://www.springframework.org/schema/context 10 http://www.springframework.org/schema/context/spring-context.xsd 11 http://www.springframework.org/schema/aop 12 http://www.springframework.org/schema/aop/spring-aop.xsd 13 http://www.springframework.org/schema/tx 14 http://www.springframework.org/schema/tx/spring-tx.xsd"> 15 16 <!-- 开启哪个包下的注释 开启包的时候,会开启包下的所有子包 --> 17 <context:component-scan base-package="com.sikiedu"></context:component-scan> 18 19 </beans>
<!-- 告诉struts,不用创建Action,由Spring来创建 --> <constant name="struts.objectFactory" value="spring"></constant>
AOP行话:
● 连接点:目标对象中,所有可以增强的方法
● 切入点:目标对象中,已经增强的方法
● 通知:增强的代码
● 目标对象:被代理的对象
● 织入:将通知应用到切入点的过程
● 代理:将通知织入到目标对象之后,形成的对象
● 切面:切入点+通知
spring整合Hibernate(小整合)
① 导入c3p0包、spring-orm包、spring-tx包
② applicationContext.xml配置;sessionFactory不用配置绑定线程 否则会报异常
<!-- 配置dataSource --> <bean name="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/spring?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8&useSSL=true"></property> <property name="driverClass" value="com.mysql.jdbc.Driver"></property> <property name="user" value="root"></property> <property name="password" value="123456"></property> </bean> <!-- 配置sessionFactory --> <bean name="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean"> <property name="dataSource" ref="dataSource"></property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop> <prop key="hibernate.show_sql">true</prop> <prop key="hibernate.format_sql">true</prop> <prop key="hibernate.hbm2ddl.auto">update</prop> <prop key="hibernate.connection.isolation">4</prop> </props> </property> <!-- 配置ORM元数据,会自动扫描该包下的所有配置文件 --> <property name="mappingDirectoryLocations" value="classpath:com/sikiedu/domain"></property> </bean>
③ Dao层配置注入sessionFactory
<!-- 配置Dao --> <bean name="userDao" class="com.sikiedu.dao.UserDao"> <property name="sessionFactory" ref="sessionFactory"></property> </bean>
④ Dao层继承HibernateDaoSupport类,使用getHibernateTemplate()方法获取Session
package com.sikiedu.dao; import org.hibernate.Session; import org.hibernate.Transaction; import org.hibernate.query.NativeQuery; import org.springframework.orm.hibernate5.HibernateTemplate; import org.springframework.orm.hibernate5.support.HibernateDaoSupport; import com.sikiedu.domain.User; public class UserDao extends HibernateDaoSupport { public User findUser(User user) { Session session = getHibernateTemplate().getSessionFactory().getCurrentSession(); // Session session = HibernateUtils.getCurrentSession(); String sql = "SELECT * FROM user WHERE username = ? AND password = ?"; NativeQuery<User> sqlQuery = session.createSQLQuery(sql); sqlQuery.setParameter(1, user.getUsername()); sqlQuery.setParameter(2, user.getPassword()); sqlQuery.addEntity(User.class); User temp = sqlQuery.uniqueResult(); return temp; } }
AOP配置事务
● applicationContext.xml配置
<!-- 配置事务的核心管理器,依赖于连接池 --> <bean name="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory"></property> </bean> <!-- 配置事务的通知 --> <tx:advice id="advice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="*"/><!-- 所有方法都配置 --> </tx:attributes> </tx:advice> <!-- 织入 --> <aop:config> <!-- 配置切入点 --><!-- * com.sikiedu.service.*.*(..)表示com.sikiedu.*.*包下的所有类的所有方法;(..)表示方法参数可有可无--> <aop:pointcut expression="execution(* com.sikiedu.service.*.*(..))" id="pointcut"/> <aop:advisor advice-ref="advice" pointcut-ref="pointcut"/> </aop:config>
● 配置web.xml,扩大Session范围
<!-- 扩大Session范围 --> <filter> <filter-name>openSession</filter-name> <filter-class>org.springframework.orm.hibernate5.support.OpenSessionInViewFilter</filter-class> </filter> <filter-mapping> <filter-name>openSession</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- //扩大Session范围 -->
● service层使用
1 package com.sikiedu.service; 2 3 import com.sikiedu.dao.UserDao; 4 import com.sikiedu.domain.User; 5 6 public class UserService { 7 8 private UserDao userDao; 9 10 public User findUser(User user) { 11 12 User temp = null; 13 temp = userDao.findUser(user); 14 return temp; 15 } 16 17 public UserDao getUserDao() { 18 return userDao; 19 } 20 21 public void setUserDao(UserDao userDao) { 22 this.userDao = userDao; 23 } 24 25 }
原文:https://www.cnblogs.com/Dm920/p/11823745.html