spring是一个开源的控制反转(IOC)和面向切面(AOP)的容器框架
Spring默认是单例的,可以通过@Scope 指定作用域singleton、protoType
- IOC-----控制反转
作为程序员,当我们去实例化一个对象时,通常需要手动new创建一个对象,并且去跟踪该对象的生命周期,内存分配,内存释放等情况,这样对我们写代码会造成很大不方便,而使用spring容器,spring的实例化new交给容器,我们使用 getBean获取该对象即可,不需要去管理对象
- AOP-----面向切面
在程序开发中主要用来解决一些系统层面上的问题,比如日志,事务,权限等待,Struts2的拦截器设计就是基于AOP的思想,是个比较经典的例子
(1)Aspect(切面):通常是一个类,里面可以定义切入点和通知
(2)JointPoint(连接点):程序执行过程中明确的点,一般是方法的调用
(3)Advice(通知):AOP在特定的切入点上执行的增强处理,
Spring切面可以应用五种类型的通知:
before:前置通知,在一个方法执行前被调用。@Before
after: 在方法执行之后调用的通知,无论方法执行是否成功。@After
after-returning: 仅当方法成功完成后执行的通知。@AfterReturning
after-throwing: 在方法抛出异常退出时执行的通知。@AfterThrowing
around: 在方法执行之前和之后调用的通知。@Around
4)Pointcut(切入点):就是带有通知的连接点,在程序中主要体现为书写切入点表达式
(5)AOP代理:AOP框架创建的对象,代理就是目标对象的加强。Spring中的AOP代理可以使JDK动态代理,也可以是CGLIB代理,前者基于接口,后者基于子类
- DI------依赖注入
即容器创建对象后,已经处理了对象的依赖关系
1、构造器注入
2、使用属性setter方法注入
3、采用注解的方式
@Autowired和@Resource注解进行装配,二者的区别是@Autowired默认按类型装配,@Resource默认是按照名称装配,当找不到与名称匹配的bean就会按照类型装配。
注意:建议使用@Resource进行装配,它是javaee中的包,而@Autowired是spring提供的注解包,扩展性没有前者好
(一)spring实例化bean:
- 构造器实例化bean
<bean id="personService" class="com.impl.PersonServiceBean"/>
- 静态工厂实例化bean
<bean id="orderService" class="com.OrderFactory" factory-method="createOrder"/>
public class OrderFactory{
public static OrderServiceBean createOrder(){
return new OrderServiceBean();
}
}
- 实例工厂实例化bean
<bean id="orderFactory" class="com.OrderFactory"/>
<bean id="oService" factory-bean="personService" factory-method="createOrder"/>
public class OrderFactory{
public OrderServiceBean createOrder(){
return new OrderServiceBean();
}
}
(二)Spring的事务管理
事务有四大特性(ACID):
1.原子性(Atomicity)事务是一个原子操作,由一系列动作组成。事务的原子性确保动作要么全部完成,要么完全不起作用。
2.一致性(Consistency)事务在完成时,必须是所有的数据都保持一致状态。
3.隔离性(Isolation)并发事务执行之间无影响,在一个事务内部的操作对其他事务是不产生影响,这需要事务隔离级别来指定隔离性。
4.持久性(Durability)一旦事务完成,数据库的改变必须是持久化的。
<bean id="ibatisTransactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<tx:advice id="ibatisTxAdvice"
transaction-manager="ibatisTransactionManager">
<tx:attributes>
<tx:method name="do*" read-only="false"
rollback-for="Exception" />
<tx:method name="is*" read-only="true" />
<tx:method name="has*" read-only="true" />
<tx:method name="query*" read-only="true" />
</tx:attributes>
</tx:advice>
<bean id="taskAfterAdvice"
class="com.common.TaskAfterAdvice" />
<aop:config proxy-target-class="true">
<aop:advisor
pointcut="execution(* com.cares..service.impl..*ServiceImpl.*(..))) "
advice-ref="ibatisTxAdvice" />
<aop:advisor
pointcut="execution(* com.cares.clc..service.impl..*ServiceImpl.*(..))) "
advice-ref="taskAfterAdvice" />
</aop:config>
<aop:aspectj-autoproxy />
Spring使用的设计模式:
1.工厂模式,在各种BeanFactory以及ApplicationContext创建中都用到了;
2.模版模式,在各种BeanFactory以及ApplicationContext实现中也都用到了
3.代理模式,在Aop实现中用到了JDK的动态代理;
4.单例模式