记录spring源码学习(Spring组件和IOC容器使用)第五天
查看下方地址学习,本页面只是自己学习代码的整理.
查看视频地址 https://www.bilibili.com/video/av59378064/?p=5 侵删
@Autowired三种注入方式
@Autowired //1
private Moon moon;
public Sun(@Autowired Moon moon) { //2
System.out.println("sun----------");
this.moon = moon;
}
@Autowired//3
public void setMoon(Moon moon) {
this.moon = moon;
}
Spring组件使用
@Component
public class Light implements ApplicationContextAware , BeanNameAware, EmbeddedValueResolverAware {
private ApplicationContext applicationContext;
public void setBeanName(String s) {
System.out.println("当前的BeanName 为:"+s);
}
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
System.out.println("传入的IOC容器:"+applicationContext);
this.applicationContext = applicationContext;
}
//解析器
public void setEmbeddedValueResolver(StringValueResolver stringValueResolver) {
String result = stringValueResolver.resolveStringValue("你好${os.name},计算#{3*8}");
System.out.println(result);
}
}
IOC容器使用5种
- 前置通知 在方法之前执行执行(@Before)
- 后置通知 在方法之后执行,不论有无异常(@After)
- 返回通知 在目标方法正常返回值后运行(@AfterReturning)
- 异常通知 在目标方法出现异常时执行(@AfterThrowing)
- 环绕通知 ,动态代理,执行joinPoint.procced()(@Around)
--------------------------业务类---------------------------
@Component
public class Light implements ApplicationContextAware , BeanNameAware, EmbeddedValueResolverAware {
private ApplicationContext applicationContext;
public void setBeanName(String s) {
System.out.println("当前的BeanName 为:"+s);
}
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
System.out.println("传入的IOC容器:"+applicationContext);
this.applicationContext = applicationContext;
}
//解析器
public void setEmbeddedValueResolver(StringValueResolver stringValueResolver) {
String result = stringValueResolver.resolveStringValue("你好${os.name},计算#{3*8}");
System.out.println(result);
}
}
--------------------------切面类---------------------------
@Aspect
public class LogAspects {
@Pointcut("execution(public int com.cap11.aop.Calculator.*(..))")
public void pointCut(){
}
@Before("pointCut()")
public void logStart(JoinPoint joinPoint){
System.out.println(joinPoint.getSignature().getName()+"方法前置通知执行,参数列表为"+ Arrays.asList(joinPoint.getArgs()));
}
@After("pointCut()")
public void logEnd(){
System.out.println("后置通知执行");
}
@AfterReturning(value = "pointCut()",returning = "result")
public void logReturn(Object result){
System.out.println("正常返回运行结果:"+result);
}
@AfterThrowing(value = "pointCut()",throwing = "exception")
public void logException(Exception exception){
System.out.println("方法异常:"+exception);
}
@Around("pointCut()")
public Object Around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
System.out.println("Arount执行之前");
Object proceed = proceedingJoinPoint.proceed();
System.out.println("Arount执行之后");
return proceed;
}
}
--------------------------Config类---------------------------
@Configuration
@EnableAspectJAutoProxy
public class Cap11MainConfig {
@Bean
public Calculator calculator(){
return new Calculator();
}
@Bean
public LogAspects logAspects(){
return new LogAspects();
}
}
--------------------------test类---------------------------
/*
切面类
前置通知 logStart在方法之前执行执行(@Before)
后置通知 logEnd 在方法之后执行,不论有无异常(@After)
返回通知 logReturn 在目标方法正常返回值后运行(@AfterReturning)
异常通知logException 在目标方法出现异常时执行(@AfterThrowing)
环绕通知 ,动态代理,执行joinPoint.procced()(@Around)
*/
public class Cap11Test {
@Test
public void test(){
AnnotationConfigApplicationContext app = new AnnotationConfigApplicationContext(Cap11MainConfig.class);
Calculator bean = app.getBean(Calculator.class);
bean.div(6,3);
bean.div(6,0);
}
}