Spring
IOC
inversion of control 译为控制反转,也可以称之为DI
dependency injection 依赖注入
控制反转:反转的是获取对象的方式,将之前的new反转成了从ioc容器中进行获取
依赖注入:将属性值注入给属性,将属性注入给bean,将bean注入给了Ioc容器
依赖注入的方式
构造器注入
1.需要有构造方法
2.在xml使用标签
set注入
1.需要使用
2.在xml使用标签
注意:当构造器中的参数和构造方法不一致的时候,可以使用标签中index、type、name进行指定
自动装配(autowire)
byName
根据名字(id)装配。自动寻找其他bean和字段名相同的id
byType
根据类进行匹配。但是此种方式不能有两个相同类型的bean
constructor
自动寻找其他类型的bean是否和构造方法参数类型一致,本质就是byType
使用注解进行自动注入
1.在需要装配的类加上@Component或者其他注解
2.然后在applicationContext.xml文件中进行配置扫描器
<context:component-scan base-package="包"/>
@Component细化
dao层:@Repository
service层:@Service
controller层:@Controller
事务
事务特性
原子性、一致性、持久性、隔离性
编程式事务
spring推荐使用TransactionTemplate来进行编程式事务管理
我们可以手动的进行事务的开始和结束,我们可以清楚的控制事务边界
声明式事务(推荐)
声明式事务是将事务的管理交给spring进行控制,底层使用AOP技术进行事务管理。具有非侵入的特点,因此推荐。
1.在xml配置文件中加入对事务的支持
<tx:annotaion-driven transaction-manager="txManager" />
2.配置事务管理器txManager
<bean id="txManager" calss="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource">
</bean>
3.配置数据库相关dataSource
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<配驱动>
<配url>
<配账号>
<配密码>
</bean>
4.在service加@Transaction
事务的传播行为(propagation)婆婆给逊
传播行为 | 含义 |
---|---|
PROPAGATION_REQUIRED(默认) | 必须运行在事务中,如果当前事务存在,方法将会在该事务中运行。否则会启动一个新的事务 |
PROPAGATION_SUPPORTS | 表示当前方法不需要事务上下文,但是如果当前存在事务的话,那么方法会在这个事务中运行 |
PROPAGATION_MANDATORY | 表示该方法必须在事务中运行,如果当前不存在事务则会抛出异常 |
PROPAGATION_REQUIRED_NEW | 表示当前方法必须运行在自己的事务中,如果增加新方法,则会重新开启一个新的事务 |
PROPAGATION_NOT_SUPPORTER | 表示该方法不应该运行在事务中,如果当前存在事务,在该方法执行期间,当前事务将会被挂起 |
PROPAGATION_NEVER | 使用事务会抛异常 |
AOP
AOP是Aspect Oriented Progarmming 面向切面编程的简称,底层实现是动态代理,动态代理分为cglib和jdk
通知
前置通知
在目标方法执行前执行,需要实现MethodBeforeAdvice接口,重写before方法
后置通知
在目标方法执行后执行,需要实现AfterReturningAdvice接口,重写afterReturning
环绕通知
在目标方法的前、后、异常发生时、最终等各个地方都可以进行的通知,是最强大的一个通知,需要实现MethodInterceptor接口(本质是拦截器实现的),重写的invoke方法
异常通知
在出现异常的时候进行通知,需要实现ThrowsAdvice接口
配置切入点
在applicationContext.xml中进行配置
<aop:config>
<aop:pointcut expression="切点表达式" id="唯一标识符"/>
<aop:advisor advice-ref="哪个方法切进去" pointcut-ref="pointcut"/>
</aop:config>
AOP的注解实现
1.写一个类,在类上加注解@Component将类加入ioc容器,配置扫描器扫描注解所在类,在类上使用注解@Aspect声明该类是一个通知,开启注解对aop的支持
<aop:aspectj-autoproxy />
注解的前置通知
2.写一个方法。在方法上使用注解@Before,注解中写切点表达式
注解的后置通知
2.写一个方法。在方法上使用注解@AfterReturning,注解中写切点表达式
注解的环绕通知
2.写一个方法。在方法上使用注解@Around,注解中写切点表达式
注解的异常通知
2.写一个方法。在方法上使用注解@AfterThrowing,注解中写切点表达式
注解的异常通知
2.写一个方法。在方法上使用注解@After,注解中写切点表达式
基于schema的AOP
写一个类,然后在xml中配置
Spring开发web项目
web项目如何初始化springioc容器
思路:当服务启动时,通过监听器将springioc容器初始化一次
使用spring-web.jar的监听器来实现
在web项目启动时会自动加载web.xml,因此需要在web.xml中加载监听器
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>