Spring 的 IOC 和 AOP 的理解

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语言的反射机制与动态代理机制来动态实现。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 本文是我自己在秋招复习时的读书笔记,整理的知识点,也是为了防止忘记,尊重劳动成果,转载注明出处哦!如果你也喜欢,那...
    波波波先森阅读 12,330评论 6 86
  • 1.1 spring IoC容器和beans的简介 Spring 框架的最核心基础的功能是IoC(控制反转)容器,...
    simoscode阅读 6,753评论 2 22
  • 手绘真的是开始了就不能停呀,不然之前的又白练习了,几天没有画了,有一点手生。画了一个不知道是什么的产品,还有一个沙...
    颜控小阿阅读 156评论 0 2
  • 朗特星的冬天会让多数人选择窝在家里工作,除了小孩子们大概不会有人想接触雪,毕竟谁都不想一出门刚走两步就被雪埋住。 ...
    仙橙多阅读 184评论 0 0
  • 今天中午,积累一周之久的潮湿终于在北风的带领下逐渐退去,我跟老公决定一访荔湾公园里古色古香的湖畔书斋。 当看到一本...
    奕奕GRACE阅读 264评论 0 0