二. Spring 中对象的注入方式Spring 是一个轻量级框架,目的是为了让对象之间的耦合性降低(解耦),方便后期代码的维护;
Spring 本质上就是一个 Bean 工厂,应用程序中所有的对象生命周期都是由 Spring 来管理的;
-
set 注入(实体类中的属性必须有 set 方法)
<bean name="user" class="com.ztkj.entity.User"> <property name="userId" value="1"> </property> <property name="userName" value="小溪"> </property> <property name="userPass" value="123"> </property> </bean>
-
构造方法注入(实体类中必须有带参数的构造方法)
<bean name="user" class="com.ztkj.entity.User"> <constructor-arg index="0" value="1"></constructor-arg> <constructor-arg index="1" value="小悕"></constructor-arg> <constructor-arg index="2" value="666"></constructor-arg> </bean>
Spring 的配置文件中,一个 bean 标签代表一个对象,创建的时候默认是采取单例模式,若想采取原型模式,则要给 bean 标签加上
scope="prototype"
-
单例模式
public class Single { // 自身成为自身的静态属性 private static Single s = null; // 构造方法私有化 private Single() {} // 提供一个外部可访问的静态方法 public static synchronized Single getSingle() { if (s == null) { s = new Single(); } return s; } }
-
原型模式
与单例模式相反,每次获取的对象都是新的对象
-
工厂模式
根据配置文件,动态的获取一组类中某个类的实例,一般来讲这一组类都实现了同一个接口或继承了同一个类
-
代理模式
- Hibernate 懒加载返回的是一个代理对象
- Struts 的 action 代理
- IOC(控制反转)/ DI(依赖注入)
- AOP(面向切面编程)
在没有出现 Spring 框架之前,一个对象调用另一个对象的方法时,需要先在当前对象中创建出另一个对象,这些对象之间才有了关系(耦合性较高),而Spring 框架,应用程序中所有的对象都是由 Spring 容器来管理它们的生命周期,此时一个对象需要调用另一个对象的方法时,Spring 容器会把相对应的对象给你,则不需要在当前类创建新的对象
AOP把 SessionFactory 对象注入到 Dao 层,把 Dao 层对象注入到 Service 层,把 Service 层对象注入到 Action 层
在程序运行到某一个点时(切入点),使程序暂时停下来,去执行人为切入的一段代码,再继续执行原来的业务逻辑代码,切入的代码并不会影响到原来业务逻辑代码的执行,一般用于事务管理或日志管理
五. Spring 的通知类型静态工厂注入,实例工厂注入
- 前置通知:程序执行到切入点(Service 层的方法)之前执行切入的代码
- 后置通知:程序执行到切入点(Service层的方法)之后执行切入的代码
- 异常通知:切入点抛出异常
- 环绕通知
- 引入通知
- 创建实体类,配置映射文件,通过 Hibernate SchemaExport 对象创表
- 编写 Dao 层接口和实现类(封装 BaseDao)
- 编写 Service 层接口和实现类
- 在
web.xml
中配置 Struts2 的核心过滤器,创建 Action,并在struts.xml
中配置 Action 信息 - 在
web.xml
中配置 Spring 的监听器,并指定读取的文件路径 - 在 Spring 的配置文件中配置:dataSource,sessionFactory,transactionManager(事务管理器),tx:advice(事务传播特性),aop(面向切面编程)
Tomcat 服务器启动的时候,会读取web.xml
配置文件,加载 Spring 的监听器,Spring 监听器此时就会去读取 Spring 的配置文件(applicationContext.xml) 后实例化所有的对象