
IoC控制反转控制是谁来创建对象谁来决定对象之间的依赖关系反转是把这个控制权交给Spring没IoC的时候自己要new对象publicclassUserService{// 你自己手动创建 UserDaoprivateUserDaouserDaonewUserDao();// 你来new你来控制publicvoidsave(){userDao.save();}}有IoC的时候无需自己newpublicclassUserService{Autowired// 告诉Spring请帮我把UserDao的实例注入进来privateUserDaouserDao;publicvoidsave(){userDao.save();}}DI依赖注入Spring把需要的对象注入到对象里面你的 UserService 依赖 UserDao没有 UserDao 就没法干活 Spring 把 UserDao 注入送进到 UserService 里一共有三种注入方式构造器注入Setter注入字段注入构造器注入ServicepublicclassUserService{privatefinalUserDaouserDao;// 通过构造函数把依赖送进来publicUserService(UserDaouserDao){this.userDaouserDao;}}Setter注入ServicepublicclassUserService{privateUserDaouserDao;// 通过setter方法注入AutowiredpublicvoidsetUserDao(UserDaouserDao){this.userDaouserDao;}}字段注入ServicepublicclassUserService{Autowired// 直接标在字段上privateUserDaouserDao;}不同位置的含义// 方式1放在构造器上 ServicepublicclassOrderService{privatefinalOrderDaoorderDao;Autowired// 告诉Spring创建OrderService时请调用这个构造器publicOrderService(OrderDaoorderDao){// ^^^^^^^^^// Spring 看到构造器需要 OrderDao// 就去容器里找一个 OrderDao 传进来this.orderDaoorderDao;}}// 方式2放在 setter 方法上 ServicepublicclassOrderService{privateOrderDaoorderDao;Autowired// 告诉Spring创建完 OrderService 后请调用这个 setter 方法publicvoidsetOrderDao(OrderDaoorderDao){// ^^^^^^^^^// Spring 找到 OrderDao传进来this.orderDaoorderDao;}}// 方式3放在字段上最常见ServicepublicclassOrderService{Autowired// 告诉Spring请直接把 OrderDao 的实例塞到这个字段里privateOrderDaoorderDao;// ^^^^^^^^^^// Spring 用反射直接把值塞进去// 不经过任何方法直接改字段的值}Bean和Spring容器BeanBean就是一个交给Spring容器的Java对象Service// 这个注解告诉Spring请把UserService当成Bean来管理publicclassUserService{...}Repository// 这个注解告诉Spring请把UserDao当成Bean来管理publicclassUserDao{...}Service、Repository、Component、Controller → 都是在贴标签告诉 Spring这个类请你管理 Spring 看到标签后就会自动创建这个类的实例放进容器里 以后谁需要这个对象Spring 就从容器里取出来给你 以上这些都是加载类上的Bean一般写在 Configuration 配置类里面**把方法返回的对象交给 Spring 容器成为 Bean**Spring容器就是存放Bean的容器AOP面向切面编程一句话定义把这些重复的、跟核心业务无关但又必须做的事情权限检查、日志、事务抽出来统一处理没有用AOP之前要进行日志管理的时候// 没有AOP每个方法都要写重复代码publicvoidaddUser(){checkPermission();// 权限检查log.info(开始执行);// 日志记录// 真正的业务逻辑只有这一行userDao.addUser();log.info(执行完毕);// 日志记录}publicvoiddeleteUser(){checkPermission();// 又要写一遍log.info(开始执行);// 又要写一遍userDao.deleteUser();log.info(执行完毕);// 又要写一遍}用了AOP之后Aspect// 这是一个切面ComponentpublicclassLogAspect{Before(execution(* com.example.service.*.*(..)))// 翻译在service包下所有方法执行之前先执行这段代码publicvoidbeforeLog(){log.info(方法开始执行);}After(execution(* com.example.service.*.*(..)))// 翻译在service包下所有方法执行之后再执行这段代码publicvoidafterLog(){log.info(方法执行完毕);}}AOP里面的几个定义切入点Pointcut需要加附加逻辑的方法连接点JoinPoint所有能附加逻辑的方法通知Advice核心业务逻辑前后要做的东西就是通知切面Aspect切入点加通知就是一套增强方案目标对象Target就是核心业务逻辑代理Proxy就是一个代理对象做的事情是核心逻辑加附加逻辑