spring的好处:
1. spring能消除在许多工程中常见的对singleton的过多使用
2. spring能消除各种各样自定义格式的属性文件的需要,是配置信息一元化
3. spring能够帮助我们真正意义上实现针对接口编程
4. 使用spring构建的应用程序易于单元测试
5. spring支持JDBC和O/R Mapping产品(Hibernate)
6. MVC Web框架,提供一种清晰,无侵略性的MVC实现方式
7. spring能使用AOP提供声明性事务管理,可以不直接操作JTA也能够对事物进行管理
spring的IoC/DI
IoC(Inversion of Control 控制反转):不创建对象,但是描述创建他们的方式,在代码中不直接与对象和服务连接,但在配置文件中描述哪一个组件需要服务那一项,容器(在spring框架中是IOC容器)负责将这些联系在一起
IOC组件注入的方式
1. 接口注入
2. 通过set方法注入(设置注入)
3. 通过构造方法注入
DI
spring 容器:bean工厂与应用上下文ApplicationCountext
**bean工厂&ApplicationCountext联系**
- ApplicationCountext扩展bean工厂接口
- ApplicationCountext提供附加功能
- bean工厂延迟加载所有的bean,直到getBean被调用
- ApplicationCountext则在初始化自身时检验,为立即加载,这样有利于检查所依赖属性是否注入,所以通常情况下我们选择使用ApplicationCountext
- spring容器中的bean缺省状态下是单列模式
常用实现:
- ClassPathXmlApplicationContext spring配置文件必须放在src目录下
- FileSystemXMLApplicationContext 配置文件放在工程下
- XmlWwbApplicationContext 根据布署路径查找,webroot列如:
- ApplicationContext = new ClassPathXmlApplicationContext("app*.xml")
bean中id和name的区别
- id是唯一标示bean,不能用特殊字符:x#@,不能用数字开头,在bean引用的时只能有id指向你需要的bean
- name可以用特殊字符,并且一个bean可以用多个名称:name="bean1,bean2,bean3,bean4",用逗号隔开,如果没有id,则name的第一个名称默认是id
代理(Proxy)模式:在目标方法执行前或执行后,附加非功能性的逻辑
AOP术语:
- 切面(Aspect):就是你要实现的交叉的非核心业务功能
- 通知(Advice):通知切面的实际实现代码
- 切入点(Pointcut):定义通知应用在那些连接点
- 目标对象(Rarget):被通知的对象
- 代理(Proxy):将通知应用到目标对象后创建的对象
通知类型:
- 环绕通知(Around):目标方法执行前、后都调用
- 前置通知(Before):目标方法调用前被调用
- 后通知(After):目标方法调用后调用
- 抛出异常通知(Throws):目标方法抛出异常时调用
ProxyFactoryBean:产生代理对象
@After 为后通知,表示目标方法执行后,无论是否有异常都会执行
@AfterReturning 为返回后通知,表示目标方法正常执行后,会执行该方法,但如果目标方法有异常抛出,则不执行。