有关IOC和AOP的拓展
IOC
一、构造方法注入
介绍
- 创建带参构造方法
实例
<bean id="a4Paper" class="cn.printer.iface.TextPaper">
<constructor-arg index="0" value="7" type="int"/>
<constructor-arg index="1" value="7" type="int"/>
</bean>
构造注入和设值注入的对比
二、p命名空间注入
改进原码
- 回到打印机的案例
之前我们为bean进行依赖注入时,使用的是
<bean id="a4Paper" class="cn.printer.iface.TextPaper">
<property name="charPerLine" value="10"/>
<property name="linePerPage" value="8"/>
</bean>
这种方式,但是spring为我们提供了一种更为简便的方式。如下
<bean id="a3Paper" class="cn.printer.iface.TextPaper" p:charPerLine="11" p:linePerPage="10"/>
那么它是如何实现的呢?
实现方式
- 首先在Spring配置文件中引入p命名空间
xmlns:p="http://www.springframework.org/schema/p"
- 然后遵循如下规则:
二种使用途径
- 1.属性赋值
<bean id="a3Paper" class="cn.printer.iface.TextPaper" p:charPerLine="11" p:linePerPage="10"/>
- 2.Bean赋值
<bean id="printer2" class="cn.printer.iface.Printer" p:ink-ref="colorInk" p:paper-ref="a3Paper"/>
注:这里ref是该容器中声明的Bean的id值
三、注入不同数据类型
- list、array、map、set、props
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd ">
<bean id="allCollectionType" class="cn.printer.setting.AllCollectionType">
<!--方式1-->
<!--<property name="list">
<list>
<value>1</value>
<value>2</value>
<value>3</value>
</list>
</property>-->
<!--方式二-->
<property name="list" value="1,2,3"/>
<property name="array">
<array>
<value>1</value>
<value>2</value>
<value>3</value>
</array>
</property>
<property name="map">
<map>
<entry>
<key>
<value>
foot
</value>
</key>
<value>足球</value>
</entry>
<entry>
<key>
<value>
basket
</value>
</key>
<value>篮球球</value>
</entry>
</map>
</property>
<property name="set">
<set>
<value>篮球_set</value>
<value>足球_set</value>
<value>乒乓球_set</value>
</set>
</property>
<property name="props">
<props>
<prop key="foot4">足球</prop>
<prop key="basket4">篮球</prop>
<prop key="pp4">乒乓球</prop>
</props>
</property>
</bean>
<!--方式三-->
<bean id="allCollectionType2" class="cn.printer.setting.AllCollectionType" p:list="1,2,3"/>
</beans>
注意:以上三种方法写一种即可
AOP
异常抛出增强
异常抛出增强的特点
- 在目标方法抛出异常时织入增强处理
- 可拔插的异常处理方案
<aop:after-throwing>
元素:定义异常抛出增强
最终增强
最终增强的特点
- 无论方法是否抛出异常,都会在目标方法最后织入增强处理,即:该增强的都会执行
- 类似于异常处理机制中的finally块的作用,一般用于释放资源
- 可以为各功能模块提供统一的,可拔插的处理方案
<aop:after>
元素:定义最终增强
环绕增强的特点
- 目标方法前后都可织入增强处理
- 功能最强大的增强处理
- 可获取或修改目标方法的参数、返回值,可对它进行异常处理,甚至可以决定目标方法是否执行
- <
aop:around>
元素:定义环绕增强
常用的增强处理类型
Spring AOP配置元素
使用注解实现IOC
- 注解方式将Bean的定义信息和Bean实现类结合在一起,Spring提供的注解有
dao数据访问层
service业务层
controller层
测试
拓展注解(@Autowired、@Resource)
@Autowired
再次进行测试,仍然正确运行!
分析
@Autowired注解会在bean容器中寻找该注解下的属性的同类型的bean,但是当寻找到多个同类型的bean时,会匹配同名的那个,如果没有同名的,报错!!
@Resource
不做演示
@Resource
@Resource 不指定参数时 按该属性的属性名查找,查找不到则按类型
@Resource(name="")
指定name时,只匹配名字(同名的bean),若找不到同名的bean,仍不对类型进行匹配,若没有直接报错
就是说指定name时,类型就不做参考
@Resource(type = UserInfoDao.class)
指定类型时,匹配类型,找不到报错,找到多个报错
@Resource(type="",name="")
两个都指定时,按照名字查找,找不到直接报错,不按类型查找
就是说指定name时,类型就不做参考
使用注解定义切面
- AspectJ
- 面向切面的框架,它拓展了Java语言,定义了AOP语法,能够在编译期提供代码的织入。
- @AspectJ
- AspectJ 5新增的功能,使用JDK5.0注解技术和正规的AspectJ切点表达式语言描述切面。
- Spring通过集成AspectJ实现了以注解的方式定义增强类,大大的减少了配置文件中的工作量
- 利用了轻量级的字节码处理框架asm处理@AspectJ中所描述的方法参数名
- 利用了轻量级的字节码处理框架asm处理@AspectJ中所描述的方法参数名
![在这里插入图片描述](https://img-blog.csdnimg.cn/30a9845ddcd74a10a0918ff0517388c0.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ4MDMzMDAz,size_16,color_FFFFFF,t_70)