文章目录
- 1.模块创建和依赖引入
- 1.聚合模块,下面有一个myspring
- 2.查看父模块是否管理了子模块
- 3.myspring模块引入基本包
- 2.进行环境搭建
- 1.目录概览
- 2.UserController.java
- 3.UserService.java
- 4.UserDao.java
- 5.AppMain.java
- 6.beans.xml
- 7.测试
- 8.配置UserController.java为多例的,然后测试
- 9.UserService调用add方法,然后测试
- 10.引入Bean后置处理器
- 1.位置
- 2.MyBeanPostProcessor.java
- 3.UserService.java 设置初始化方法
- 4.beans.xml配置扫描
- 5.测试
- 6.注意事项
- 11.引入AOP
- 1.目录
- 2.SmartAnimal.java
- 3.SmartDog.java
- 4.SmartAnimalAspect.java
- 5.beans.xml开启aop注解并扫描aop包
- 6.AppMain.java 测试AOP
- 6.简单分析AOP和后置处理器的关系
- 3.抛出问题
- 1.bean是怎么注入容器的?
- 2.为什么加了@Autowired就能被依赖注入?
- 3.单例多例是怎么实现的?
- 4.Bean的后置处理器是怎么实现的?
- 5.原生Spring的AOP是如何实现的?
- 4.将代码放到远程仓库
-
1.模块创建和依赖引入
1.聚合模块,下面有一个myspring
2.查看父模块是否管理了子模块
3.myspring模块引入基本包
<dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.3.8</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>5.3.8</version></dependency>
</dependencies>
2.进行环境搭建
1.目录概览
2.UserController.java
package com.sunxiansheng.myspring.component;import org.springframework.stereotype.Component;
@Component
public class UserController {
}
3.UserService.java
package com.sunxiansheng.myspring.component;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class UserService {@Autowiredprivate UserDao userDao;public void add() {System.out.println("UserService 调用了UserDao的add方法");userDao.add();}}
4.UserDao.java
package com.sunxiansheng.myspring.component;import org.springframework.stereotype.Component;
@Component
public class UserDao {public void add() {System.out.println("UserDao add...");}}
5.AppMain.java
package com.sunxiansheng.myspring;import com.sunxiansheng.myspring.component.UserController;
import com.sunxiansheng.myspring.component.UserDao;
import com.sunxiansheng.myspring.component.UserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class AppMain {public static void main(String[] args) {ApplicationContext ioc = new ClassPathXmlApplicationContext("beans.xml");UserController userController1 = (UserController) ioc.getBean("userController");UserController userController2 = (UserController) ioc.getBean("userController");System.out.println("userController1 == userController2 ? " + (userController1 == userController2));UserService userService = (UserService) ioc.getBean("userService");System.out.println("userService = " + userService);UserDao userDao = (UserDao) ioc.getBean("userDao");System.out.println("userDao = " + userDao);}}
6.beans.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"><context:component-scan base-package="com.sunxiansheng.myspring.component"/></beans>
7.测试
8.配置UserController.java为多例的,然后测试
9.UserService调用add方法,然后测试
10.引入Bean后置处理器
1.位置
2.MyBeanPostProcessor.java
package com.sunxiansheng.myspring.process;import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.stereotype.Component;
@Component
public class MyBeanPostProcessor implements BeanPostProcessor {@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) {System.out.println("postProcessBeforeInitialization..."+beanName+"=>"+bean.getClass());return bean;}@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) {System.out.println("postProcessAfterInitialization..."+beanName+"=>"+bean.getClass());return bean;}}
3.UserService.java 设置初始化方法
4.beans.xml配置扫描
5.测试
6.注意事项
- bean的后置处理器在初始化方法调用前后执行
- 触发时机为单例的第一次getBean和多例的每次getBean,也就是,每个Bean都会经过Bean的后置处理器处理
11.引入AOP
1.目录
2.SmartAnimal.java
package com.sunxiansheng.myspring.aop;
public interface SmartAnimal {public float getSum(float a, float b);public float getSub(float a, float b);}
3.SmartDog.java
package com.sunxiansheng.myspring.aop;import org.springframework.stereotype.Component;
@Component
public class SmartDog implements SmartAnimal {@Overridepublic float getSum(float a, float b) {System.out.println("SmartDog...getSum...res=" + (a + b));return a + b;}@Overridepublic float getSub(float a, float b) {System.out.println("SmartDog...getSub...res=" + (a - b));return a - b;}
}
4.SmartAnimalAspect.java
package com.sunxiansheng.myspring.aop;import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.*;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;import java.util.Arrays;
@Component
@Aspect
public class SmartAnimalAspect {@Before(value = "execution(public float com.sunxiansheng.myspring.aop.SmartDog.getSub(float, float))")public void before(JoinPoint joinPoint) {Signature signature = joinPoint.getSignature();System.out.println("方法执行开始-日志-方法名-" + signature.getName()+ "-参数" + Arrays.asList(joinPoint.getArgs()));SmartDog target = (SmartDog) joinPoint.getTarget();System.out.println("目标对象-" + target.getClass());}@AfterReturning(value = "execution(public float com.sunxiansheng.myspring.aop.SmartDog.getSub(float, float))")public void afterReturning(JoinPoint joinPoint) {Signature signature = joinPoint.getSignature();System.out.println("方法执行正常结束-日志-方法名-" + signature.getName());}@AfterThrowing(value = "execution(public float com.sunxiansheng.myspring.aop.SmartDog.getSub(float, float))")public void throwing(JoinPoint joinPoint) {Signature signature = joinPoint.getSignature();System.out.println("方法出现异常-日志-方法名-" + signature.getName());}@After(value = "execution(public float com.sunxiansheng.myspring.aop.SmartDog.getSub(float, float))")public void after(JoinPoint joinPoint) {Signature signature = joinPoint.getSignature();System.out.println("方法最终执行完毕-日志-方法名-" + signature.getName());}@Around("execution(public float com.sunxiansheng.myspring.aop.SmartDog.getSub(float, float))")public Object logMethodExecution(ProceedingJoinPoint joinPoint) throws Throwable {MethodSignature signature = (MethodSignature) joinPoint.getSignature();String methodName = signature.getMethod().getName();String className = signature.getDeclaringType().getSimpleName();System.out.println("环绕通知 method " + className + "." + methodName);Object targetObject = joinPoint.getTarget();System.out.println("环绕通知获取目标对象:" + targetObject);try {System.out.println("环绕通知获取参数:" + Arrays.asList(joinPoint.getArgs()));Object result = joinPoint.proceed(); System.out.println("环绕通知获取结果:" + result);return result;} catch (Exception e) {throw e;} finally {System.out.println("环绕通知 method " + className + "." + methodName);}}}
5.beans.xml开启aop注解并扫描aop包
6.AppMain.java 测试AOP
6.简单分析AOP和后置处理器的关系
3.抛出问题
1.bean是怎么注入容器的?
2.为什么加了@Autowired就能被依赖注入?
3.单例多例是怎么实现的?
4.Bean的后置处理器是怎么实现的?
5.原生Spring的AOP是如何实现的?
4.将代码放到远程仓库
1.VCS -》 share
2.查看仓库