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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容

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