美文网首页
Spring 的 IOC 和 AOP 的理解

Spring 的 IOC 和 AOP 的理解

作者: 熊猫的雄 | 来源:发表于2018-11-20 00:09 被阅读0次

    Spring

    Spring 是一个轻量级的控制反转(Ioc)和面向切面(AOP)的容器框架。

    1、Spring下的IOC容器和DI

    IOC容器:

    一个具有依赖注入功能的容器,是可以创建对象的容器,IOC容器负责实例化、定位、配置应用程序中的对象、建立对象间的依赖;一般new一个对象有程序员控制(类中new对象),而“控制反转”是指new对象的工作交给IOC容器来做。

    DI(依赖注入):

    在IOC容器创建对象后,处理对象间的依赖关系。

    注入方式:1、set方法注入;2、构造注入;3、注解方式注入。

    1、set方法注入:
    控制层代码:userService对象中拥有一个set方法;

      private UserServiceImp userService;
        
      public void setUserService(UserServiceImp UserService) {
           this.UserService = UserService;
    }
    

    Spring配置XML文件:其中配置声明userController中存在属性userService。在程序运行时会将已经实例化的userService通过调用setUserService()注入到UserController的userService。

    <bean name="userController" class="com.pec.controller.UserController">
            <property name="UserService" ref="userService"></property>
    </bean>
    <bean name="userService" class="com.pec.service.imp.UserServiceImp"></bean>
    

    2、构造注入
    控制层代码:UserController中有个重载的构造方法;

      private UserServiceImp userService;
        
      public UserController(UserServiceImp UserService) {
           this.UserService = UserService;
    }
    

    Spring配置XML文件:其中配置声明userController中构造方法的实参是userService。

    <bean name="userController" class="com.pec.controller.UserController">
            <constructor-arg ref="userService"></constructor-arg>
    </bean>
    <bean name="userService" class="com.pec.service.imp.UserServiceImp"></bean>
    

    3、依赖注入
    控制层代码

    @Autowired   //@Resource
    private UserServiceImpl userService;
    

    服务层代码

    @Service("userService")
    public class UserServiceImpl implements UserService {
    
        @Autowired
        private UserDaoImpl userDao ;
    
        @Override
        public User findUser(userId id) {
            return userDao .findUser(id);
        }
    }
    

    持久层代码

    @Repository("userDao ")
    public class UserDaoImpl implements UserDao {
    
        @Override
        public User findUser(userId id) {
            ...
        }
    }
    

    注意点:
    (1)持久层DAO层注解Repository中规定了名称,在Service层中声明名称必须一致。
    (2) 服务层Service层注解Service中规定了名称,在控制层中声明的名称必须一致。
    (3) 注解可以简化配置,提升开发效率,但是也不利于后期维护。
    (4) 注解方式注入依赖注解:

    @Component         把对象加入ioc容器,对象引用名称是类名,第一个字母小写
    @Component(“name”) 把指定名称的对象,加入ioc容器
    @Repository        主要用于标识加入容器的对象是一个持久层的组件(类)
    @Service           主要用于标识加入容器的对象是一个业务逻辑层的组件
    @Controller        主要用于标识加入容器的对象是一个控制层的组件
    @Resource          注入属性(DI), 会从容器中找对象注入到@Resource修饰的对象上
    @Autowired         注入属性(DI), 会从容器中找对象注入到@Autowired修饰的对象上
    

    1、Spring下的AOP

    AOP:

    AOP是纵向编程,比如两个业务有一样的功能,与其在两个业务中添加一样的代码,还不如把代码抽离出来,让两个业务共同使用;AOP就是把所有的共有代码抽离出来,放到指定的地方管理,逻辑代码运行时,在由容器通过织入的方式将共用代码添加到逻辑代码中。
    比如在逻辑代码中添加日志记录、权限控制、事物控制等功能。

    AOP.png

    AOP涉及名称:
    切面(Aspect):具体的共有功能的实现;如日志记录、权限控制、事物控制等功能;实际应用中是一个实现了共有功能的类,这个类如何被AOP容器识别为切面,通过配置或者注解指定。
    通知(Advice):是切面何时调用;以被切入的目标为参照物,分为前置通知(Before)、后置通知(After)、返回通知(AfterRunning)、异常通知(AfterThrowing)、环绕通知(Around);实际应用中是定义切面类中的一个方法使用何种通知,可以在配置或者注解中指定。
    连接点(Joinpoint):程序中可以被切面切入的点;一般是抛出异常、字段修改、方法调用,Spirng 中只支持方法调用走位连接点。
    切入点(Pointcut):已经被定义会被通知的一个或者多个连接点;实际应用中连接点会被什么方式通知和怎样被精准定位,通过配置或者注解实现。
    目标对象(Target):会被切面切入的对象;对象中只有逻辑代码,共有代码等待AOP容器切入。
    代理对象(Proxy):目标对象已经被切面切入或者说被通知应用到后创建的新对象;可以理解为代理对象的功能=目标对象的功能+共有功能,但代理对象对使用者是透明的,只在运行中产生。
    织入(Weaving):一个过程,将切面切入到目标对象创建一个代理对象的过程。这个过程可以发生在编译期、类装载期及运行期,当然不同的发生点有着不同的前提条件;如发生在编译期的话,就要求有一个支持这种AOP实现的特殊编译器;发生在类装载期,就要求有一个支持AOP实现的特殊类装载器;只有发生在运行期,则可直接通过Java语言的反射机制与动态代理机制来动态实现。

    相关文章

      网友评论

          本文标题:Spring 的 IOC 和 AOP 的理解

          本文链接:https://www.haomeiwen.com/subject/ljknfqtx.html