Java Spring的IoC和AOP的知识点速记
Spring简介
Spring解决的最核心的问题就是把对象之间的依赖关系转为用配置文件来管理,这个是通过Spring的依赖注入机制实现的。
Spring Bean装配
1. IOC的概念以及在Spring容器中如何进行IOC的操作。
IOC:Inversion of Control,控制反转。在Java开发中,IOC意味着将你设计好的类交给系统去控制,而不是在你的类内部控制,这称为控制反转,就是被调用类的实例由原先的调用类控制创建、销毁现在转变成由Spring的容器管理。
2. Spring容器是如何管理Bean的生命周期的(如Bean的初始化方法,Bean的销毁方法)
创建:<bean name=”” class=”” 额外属性>
初始化:配置init-method/实现接口InitializingBean
调用:context.getBean(),进行方法的调用
销毁:配置destroy-method/实现DisposableBean接口
3. DI的概念以及在Spring框架注入有几种方式。使用构造注入对象,必须要注意什么问题?
注入方式:
构造注入[构造方法注入]
属性注入[属性的SET/GET]
方法注入[工厂注入]
<!-- 构造函数注入 --> <bean id="user1" class="com.spring.test.model.User"><constructor-arg index="0" type="String" value="Lu"></constructor-arg><constructor-arg index="1" type="String" value="123456"></constructor-arg> </bean><!-- 属性注入 --> <bean id="user2" class="com.spring.test.model.User"><property name="username" value="Luxx"></property><property name="password" value="56789"></property> </bean><!-- 工厂注入 --> <bean id="userFactory" class="com.spring.test.factory.UserFactory"/> <bean id="user3" factory-bean="userFactory" factory-method="createUser"></bean><!-- 静态工厂注入 --> <bean id="user4" class="com.spring.test.factory.UserFactoryStatic" factory-method="createUser"></bean>
使用构造函数依赖注入时,Spring保证所有一个对象所有依赖的对象先实例化后,才实例化这个对象。使用set方法依赖注入时,Spring首先实例化对象,然后才实例化所有依赖的对象。
4. 使用DI注入时,Property代表什么意思,如果property引用的是其他Bean的话,如何注入,如果引用是字符串的话,如何设置。
使用DI注入时,Property代表注入类的属性,如果应用其他的bean用ref属性来表明被引用bean的名称,如果是引用字符串的话,用value属性。如:
<property name=”userDao” ref=”被引用bean的名称” /> <property name=”username” value = “字符串”/>
5. Bean的作用域
所有Spring Bean的默认都是单例,即scope=”singleton”
几种作用域:
singleton:在每一个Spring容器中,一个Bean定义只有一个对象实例。
prototype:Bean的定义可以被实例化任意次(每次调用都创建一个实例)。
request:在一次Http 请求中,每个Bean定义对应一个实例。该作用域仅在基于Web的Spring上下文(如Spring MVC)中才有效。
Session:在一个Http Session中,每个Bean定义对应一个实例。该作用域仅在基于Web的Spring上下文(如Spring MVC)中才有效。
Global-session:在一个全局Http Session中,每个Bean定义对应一个实例。该作用域仅在Portlet上下文中才有效。
6. DI自动装配(autowiring)
Spring中提供了自动装配依赖对象的机制,但是在实际应用中并不推荐使用自动装配,因为自动装配会产生未知情况,开发人员无法预见最终的装配结果。
自动装配是在配置文件中实现的,如下:
<bean id="***" class="***" autowire="byName">
只需要配置一个@Autowired属性即可完成自动装配,不用再配置文件中写<property>,但是在类中还是要生成依赖对象的setter方法。
Autowire的属性值有如下几个:
1)byName 按名称装配,可以根据属性的名称(或者ID)在容器中查询与该属性名称(或者ID)相同的bean,如果没有找到,则属性值为null;
2)byType 按类型装配,可以根据属性类型,在容器中寻找该类型匹配的bean,如有多个,则会抛出异常,如果没有找到,则属性值为null;如果有多个,使用bean的primary属性,注意:这个默认就是true,需要把非候选的bean的primary的属性设置为false。排除某些bean,设置某些bean的autowire-candidate属性为false。
3)constructor 与byType方式相似,不同之处在与它应用于构造器参数,如果在容器中没有找到与构造器参数类型一致的bean,那么将抛出异常;
4)autodetect 通过bean类的自省机制(introspection)来决定是使用constructor还是byType的方式进行自动装配。首先尝试使用constructor 进行自动装配。如果失败,再尝试使用byType的方式。
可选的自动装配:默认情况下,@Autowired具有强契约特性,其所标注的属性或参数必须是可装配的,如果没有,则自动装配失败(抛出NoSuchBeanDefinitionException)。属性不一定要装配,null值也是可以接受的,使用@Autowired(required=false)来配置是可选的。
限定歧义性的依赖:使用@Qualifier(“bean id”),通过制定Bean的ID把选择范围缩小到只剩下一个Bean。
注意:显式的指定依赖,比如property和constructor-arg元素,总会覆盖自动装配。自动装配的行为可以和依赖检查结合使用,依赖检查会在自动装配完成后发生。
7. DI自动检测(autodiscovery)
配置Spring自动检测Bean的定义和自动装配Bean:
<context:component-scan base-package="com.spring.test"/>
默认情况下,<context:component-scan>查找使用构造型注解所标注的类,这些注解如下:
@Component 通用的构造型注解,标识该类为Spring组件。
@Controller 标识该类为Spring MVC controller。
@Repository 标识该类为数据仓库,一般作为DAO层的注解。
@Service 标识该类为服务,一般作为服务层的注解。
使用@Component标注的任意自定义注解。
Spring AOP
AOP的概念以及使用AOP机制有什么好处。
AOP的概念是Aspect Oriented Programming面向切面编程。
好处:AOP将程序分解成各个方面或者说关注点,这使得可以模块化,相当横向上分切了。它可以解决OOP和过程化方法不能够很好解决的横切(cross-cutting)问题,如:事务、安全、日志等横切关注。
Spring+AspectJ 实现AOP的2种方式:
1) 使用注解(@AspectJ)实现AOP:
@Aspect @Component public class LogAspect {@Before("execution(public * com.spring.test.service.*.*(..))")public void beforeService(){System.out.println("Before ...");}@After("execution(public * com.spring.test.service.*.*(..))")public void afterService(){System.out.println("After ...");}@AfterReturning("execution(public * com.spring.test.service.UserService.save(com.spring.test.model.User)) and args(user)")public void logAfterReturn(User user){System.out.println("After return..."+user);} }
开启注解扫描:
xmlns:aop=http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd<context:component-scan base-package="com.spring.test"/> <aop:aspectj-autoproxy proxy-target-class="true"/>
注意的是 proxy-target-class="true" 属性,它的默认值是 false,默认只能代理接口(使用 JDK 动态代理),当为 true 时,才能代理目标类(使用 CGLib 动态代理)。
2)另一种XML配置方式:
public class LogAspect {public void beforeService(){System.out.println("Before ...");}public void afterService(){System.out.println("After ...");}public void logAfterReturn(User user){System.out.println("After return..."+user);} }
配置:
<bean id="logAspect" class="com.spring.test.aop.LogAspect" /> <aop:config> <aop:aspectref="logAspect"><aop:pointcut id="serviceAction" expression="execution(public * com.spring.test.service.*.*(..))"/><aop:beforepointcut-ref="serviceAction" method="beforeService"/><aop:afterpointcut-ref="serviceAction" method="afterService"/><aop:pointcutid="serviceReturnAction"expression="execution(public * com.spring.test.service.UserService.save(com.spring.test.model.User)) and args(user)"/><aop:after-returningpointcut-ref="serviceReturnAction" method="logAfterReturn" arg-names="user"/> </aop:aspect> </aop:config>
使用 <aop:config> 元素来进行 AOP 配置,在其子元素中配置切面,包括增强类型、目标方法、切点等信息。
参考:
http://docs.spring.io/spring/docs/current/spring-framework-reference/html/index.html
http://oss.org.cn/ossdocs/framework/spring/zh-cn/beans.html
本文转自阿凡卢博客园博客,原文链接:http://www.cnblogs.com/luxiaoxun/p/4625238.html,如需转载请自行联系原作者
Java Spring的IoC和AOP的知识点速记相关推荐
- Spring中IOC和AOP的详细解释(转)
原文链接:Spring中IOC和AOP的详细解释 我们是在使用Spring框架的过程中,其实就是为了使用IOC,依赖注入,和AOP,面向切面编程,这两个是Spring的灵魂. 主要用到的设计模式有工厂 ...
- Spring:IOC和AOP
Spring:IOC和AOP 一. IOC (1) 引入 (2) 定义 (3) 作用 (4) 实现 (5) DI依赖注入 二. AOP (1) 概念 (2) Spring中的AOP (3) 入门案例 ...
- Java 第一大框架:Spring 的 IoC 跟 AOP 雏形如何实现?
Spring Spring make java more simple: Spring make java more modern: Spring make java more reactive: S ...
- Spring的IoC与AOP的理解
1.Spring它到底是什么? Spring是一个开源的Java应用程序开发框架,为了解决企业应用开发的复杂性而创建的. 在spring中,它会认为一切Java类都是资源,而资源就是Bean,容纳 ...
- 彻底学会Spring的IOC和AOP——理论+实操
目录 1 IOC 1.1 概念 1.2 底层原理 1.3 IOC容器 1.4 Bean管理:基于xml配置文件实现 1.5 两种类型的Bean 1.6 Bean的作用域 1.7 Bean的生命周期 1 ...
- Spring框架(IoC、AOP面向接口切面)
新建一个Maven工程 Spring框架是由于软件开发的复杂性而创建的.Spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事情.然而,Spring的用途不仅仅限于服务器端的开发. ...
- 初学者快速了解spring的IOC和AOP原理
spring框架概述 1.spring是轻量级的开源的javaEE框架 2.spring可以解决企业应用开发的复杂性 3.spring有两个核心部分:IOC和AOP (1)IOC:控制反转,把创建对象 ...
- spring中IoC和AOP的实现
6.2 spring IoC IoC容器是Spring的核心.容器从配置文件中读取需要创建哪些对象,并在创建后按照要求把它们进行装配,通过这样的方法达到业务代码解耦的目的.不仅如此,spring还负责 ...
- Spring的IOC和AOP思想
Spring框架的两大核心(ioc和aop) 一.ioc:控制反转(Inversion of Control)思想 1.1.由spring来负责控制对象的生命周期和对象间的关系(SSM框架中的依赖关系 ...
最新文章
- Android系统手机端抓包方法
- MPB:中南大学刘学端、马丽媛组-基于16S测序和RT-qPCR的硫化矿物表面微生物群落组成分析...
- 华人小哥控诉机器学习「四大Boring」,CS博士:深有同感,正打算退学
- 【java学习笔记-io流 文件读写和键盘读写】带缓存的输入/输出流和数据输入/输出流
- python小屋_Python小屋——Python语言基础(三)
- python matplotlib画折线图出现连线混乱_python使用matplotlib模块绘制多条折线图、散点图...
- K - Triangle 计蒜客 - 42405
- LintCode 373: Partition Array
- Leetcode--560. 和为K的子数组
- mysqld.exe
- redis缓存雪崩,缓存穿透,缓存击穿的解决方法
- 23种设计模式之适配器模式(Adapter模式)
- XS9950是单路AHDRX芯片,国产单通道模拟复合视频解码芯片方案,硬件替代TP9950。
- freebsd12 安装gnome3图形界面
- 用Python画二元高次方程
- Dell R720xd服务器装机暨改造过程
- matlab中的箭头符号怎么打开,MATLAB中上下标、斜体、箭头等符号的使用方法
- 智能无障碍轮椅——DX-BT04 2.0蓝牙模块
- Fliqlo.scr怎么安装
- hana 服务器性能测试,SAP HANA
热门文章
- python 打开网页、封装自己的浏览器、制作浏览器、打开麦克风和摄像头、忽略ssl证书错误、置顶、无边框
- GNT格式转换为PNG格式
- Linux内核实现原子性操作cmpxchg指令的理解
- PHP支持http2,swoole-1.8.2 已发布,支持Http2.0协议
- HTML锚点为什么叫hash,javascript – jQuery this.hash行为在页面锚点链接
- cli能记日志web不能php,异步日志输出方案
- docker 厂商 容器_中国容器厂商综合实力排名,新鲜出炉!
- 【Netty】Netty线程模型和EventLoop
- 在vscode中统一vue编码风格的方法
- 从一次故障聊聊前端 UI 自动化测试