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。


        


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

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

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


        


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 的理解)