最近在复习spring5框架,总结一下工作中常用的一些方法的原始方法。
(一)Spring之IOC详解(工厂设计模式,反射)
-
spring ioc所属的jar包
-
对象初始化DI注入(基于XML的配置) ,
如果对象里面包含其它对象,用 ref 引入;
-
基于注解方式实现属性的注入的几种方式(需要开启扫描)
a.基于xml配置:<context:component-scan base-package="com.wwy.spectj"/>
b.基于类的注解配置:@ComponentScan(basePackages = {"com.wwy.spectj"})
@Controller 控制层,默认使用的注解,spring管理
@Service 业务层,默认使用的注解,spring管理
@Repository 声明此类是一个dao类,访问数据库
@Component 声明此类是一个Spring管理的类
@RestController 等于@Controller+@ResponseBody,用于REST服务,可返回json格式字符串
@PostConstruct 当bean被容器初始化后会调用@PostConstruct注解的方法
@Configuration 声明此类是一个配置类,
@PreDestroy在容器被销毁之前调用@PreDestory注解的方法
@Bean 用在方法上,声明该方法执行的结果返回结果是一个spring容器管理的Bean
- bean的生命周期
实际来讲有七步,继承BeanPostProcessor实现其方法,就会在执行初始化之前后来调用其方法:
(二)Spring之AOP详解(代理模式)
JDK动态代理的方法:使用Proxy类,调用newProxyInstance方法
AOP的常用术语
- 连接点:类里面有哪些方法可以被增强,这些方法称之为连接点
- 切入点:实际被增强的方法,称之为切入点
- 通知(增强):实际增强的逻辑部分称为通知(增强);
通知的类型有:前置通知;后置通知;环绕通知,异常通知,最终通知 - 切面:把通知应用到切入点的过程。
AspectJ:spring框架一般是基于AspectJ进行AOP操作,其并不是spring框架的组成部分。
切入点表达式:
1.作用:对那个类里面的那个方法增强
2.语法结构:execution([权限修饰符] [返回类型] [类的全路径] [方法名称] ([参数列表]))
3. 相同的切入点抽取:
@Pointcut("execution(* com.wwy.spectj.Book.buy(..))")
public void pointDemo(){
}
@Before(value ="pointDemo()")
public void before(){
System.out.println("before.......");
}
@After(value = "pointDemo()")
public void after(){
System.out.println("after.......");
}
1)基于XML配置实现aspectJ:
<!--注入普通类-->
<bean id="book" class="com.wwy.spectj.Book"></bean>
<!--注入代理类-->
<bean id="bookProxy" class="com.wwy.spectj.BookProxy"></bean>
<!--配置Aop增强-->
<aop:config>
<!--切入点-->
<aop:pointcut id="p" expression="execution(* com.wwy.spectj.Book.buy(..))"/>
<!--配置切面-->
<aop:aspect ref="bookProxy">
<!--增强在具体的方法-->
<!--前置通知方法-->
<aop:before method="before" pointcut-ref="p"/>
<!--后置置通知方法-->
<aop:after method="after" pointcut-ref="p"/>
<!--异常通知方法-->
<aop:after-throwing method="afterThrowing" pointcut-ref="p"/>
</aop:aspect>
</aop:config>
2)基于注解配置类实现aspectJ:
@Component
@Aspect//生成代理对象
public class TestProxy {
@Pointcut("execution(* com.wwy.spectj.Book.buy(..))")
public void pointDemo(){
}
@Before(value ="pointDemo()")
public void before(){
System.out.println("before.......");
}
@After(value = "pointDemo()")
public void after(){
System.out.println("after.......");
}
@AfterReturning(value = "pointDemo()")
public void afterReturning(){
System.out.println("afterReturning.......");
}
@AfterThrowing(value = "pointDemo()")
public void afterThrowing(){
System.out.println("afterThrowing.......");
}
@Around(value = "pointDemo()")
public void around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
System.out.println("around之前。。。。。。");
proceedingJoinPoint.proceed();
System.out.println("around之后。。。。。。");
}
}
在xml里面开启:
<!--开启AspectJ生成代理对象-->
<aop:aspectj-autoproxy/>
(三)Spring之事务管理
1)基于XML配置实现事务管理:
<!--配置数据库连接池-->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql:///springtest" />
<property name="username" value="root" />
<property name="password" value="abc"></property>
</bean>
<!--JdbcTemplate-->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<!--注入数据源-->
<property name="dataSource" ref="dataSource"/>
</bean>
<!--创建事务管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!--注入数据源-->
<property name="dataSource" ref="dataSource"/>
</bean>
<!--开启事务注解-->
<tx:annotation-driven transaction-manager="transactionManager"/>
2)基于注解配置类实现事务管理:
@Configuration //配置类
@ComponentScan(basePackages = "com.wwy.jdbc")//扫描类
@EnableTransactionManagement//开启事务
public class AnnoConfig {
}
3)事务的传播行为
//默认的事务传播行为
@Transactional(rollbackFor = Exception.class,propagation = Propagation.REQUIRED)
事务的传播行为类型 | 具体解释 |
---|---|
PROPAGATION_REQUIRED | 如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。 |
PROPAGATION_SUPPORTS | 支持当前事务,如果当前没有事务,就以非事务方式执行。 |
PROPAGATION_MANDATORY | 使用当前的事务,如果当前没有事务,就抛出异常。 |
PROPAGATION_REQUIRES_NEW | 新建事务,如果当前存在事务,把当前事务挂起。 |