01注解驱动开发
p02 @Configuration&@Bean给容器添加组件
创建个maven项目
xml以前的写法
实体类
配置类写法
p03 组件注册@ComponentScan 自动扫描组件
以前xml配置组件扫描
配置类配置组件扫描
@configuration也是一个component
p04 组件注册 自定义TypeFilter指定过滤规则
自定义扫描规则
会扫描当前包下所有的类,matcn 方法返回为true的就会加入容器
例如
p 08 @import给容器快速导入一个组件
p09 @import使用importSelector
使用@import直接就将bule加入bean容器了
实现了importSelector的类会把方法中返回的类red放入容器
p10 @import使用之importBeanDefinitionRegistar
自己指定创建bean rainbow
p11 使用FactoryBean注册组件
从容器里拿这个colorFactoryBean,只会拿到他创建的color对象
如果想拿到原本的colorFactoryBean对象,需要加前缀**&**
p12 生命周期 @Bean指定初始化和销毁方法
生命周期:bean创建-初始化-销毁
xml定义 初始化方法和销毁方法
注解类型 初始化方法和销毁方法
默认单例模式下 创建容器的时候,会直接创建bean对象,并且调用init初始化方法
关闭容器,对象销毁
多实例prototype情况下,使用该对象的时候,才会调用 bean的构造方法和初始化方法,
并且,在关闭容器的时候,不会调用该bean的destory方法
p13 生命周期 initializingBean和DisposableBean
另外一种初始化方法和销毁方法 实现接口
p14 生命周期 @PostConstruct&@PreDestroy
p15 生命周期-BeanPostProcessor 后置处理器
p16 BeanPostProcessor原理
从源码可以看到 在初始化之前和之后,会调用BeanPostProcessor相关前置后置方法
p17 生命周期 BeanPostProcessor在Spring底层的使用
1
bean后置处理器有一个接口实现类
2
3
p18 @value属性赋值
p19 @PropertySource加载外部配置文件
另外 通过容器获取环境,环境也可以获取配置文件中的值
p20 自动装配 @Autowire&@Qualifier&@Primary
@autowire根据类型注入
结合@qualifier使用 指定名称
@autowire非必需注入
@Primary 首选bean
p21 自动装配@Resource @Inject
p22 自动装配-方法 构造器位置的自动装配
@autowire使用在方法上
@autowire标在构造器上
放在构造器的参数上,效果也是一样的
@autowire放在@bean的方法参数旁边,这里省略不写
p23 自动装配Aware注入Spring底层组件&原理
实现各种aware接口
p24-25@profile环境搭建
@value其实也可以用在方法参数上 直接获取配置
模拟多环境数据源的配置,配置多个数据源bean,
使用虚拟机命令行参数
test环境
切换dev环境的bean
代码的方式激活某种环境
使用无参构造获取容器,容器获取environment设置激活环境
@Profile也可以使用在类上面,只有当环境为此模式下才会加载这个类
p26 ioc 小结
p27 AOP AOP功能测试
通配符写法 所有方法 任意个参数
抽取切点表达式
别忘了 给当前切面类加上注解
如果有配置文件,可以使用这个标签,开启基于注解版的切面功能
但是现在全部都使用注解,所以使用@EnableAspeceAutoProxy
总结
业务类
package com.atguigu.aop;
public class MathCalculator {
public int div(int i,int j){
System.out.println("MathCalculator...div...");
return i/j;
}
}
切面类
/**
* 切面类
* @author lfy
*
* @Aspect: 告诉Spring当前类是一个切面类
*
*/
@Aspect
public class LogAspects {
//抽取公共的切入点表达式
//1、本类引用
//2、其他的切面引用
@Pointcut("execution(public int com.atguigu.aop.MathCalculator.*(..))")
public void pointCut(){};
//@Before在目标方法之前切入;切入点表达式(指定在哪个方法切入)
@Before("pointCut()")
public void logStart(JoinPoint joinPoint){
Object[] args = joinPoint.getArgs();
//joinPoint.getSignature().getName()获取方法
System.out.println(""+joinPoint.getSignature().getName()+"运行。。。@Before:参数列表是:{"+Arrays.asList(args)+"}");
}
@After("com.atguigu.aop.LogAspects.pointCut()")
public void logEnd(JoinPoint joinPoint){
System.out.println(""+joinPoint.getSignature().getName()+"结束。。。@After");
}
//JoinPoint一定要出现在参数表的第一位
@AfterReturning(value="pointCut()",returning="result")
public void logReturn(JoinPoint joinPoint,Object result){
System.out.println(""+joinPoint.getSignature().getName()+"正常返回。。。@AfterReturning:运行结果:{"+result+"}");
}
@AfterThrowing(value="pointCut()",throwing="exception")
public void logException(JoinPoint joinPoint,Exception exception){
System.out.println(""+joinPoint.getSignature().getName()+"异常。。。异常信息:{"+exception+"}");
}
}
配置类
@EnableAspectJAutoProxy
@Configuration
public class MainConfigOfAOP {
//业务逻辑类加入容器中
@Bean
public MathCalculator calculator(){
return new MathCalculator();
}
//切面类加入到容器中
@Bean
public LogAspects logAspects(){
return new LogAspects();
}
}
p28 AOP原理 @EnableAspectJAutoProxy
p29 源码分析 AnnotationAwareAspectJAutoProxyCreator分析
方法重写情况
p30 AOP原理 注册AnnotationAwareAspectJAutoProxyCreator
这里暂时看不太懂,有点枯燥,先去看大厂学院的视频了