有关IOC和AOP的拓展(构造方法注入、p命名空间、list、array、map、set、props、AOP、 @Resource和@Autowired注解详解)

28 篇文章 0 订阅
16 篇文章 0 订阅

有关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中所描述的方法参数名
      -

 ![在这里插入图片描述](https://img-blog.csdnimg.cn/30a9845ddcd74a10a0918ff0517388c0.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ4MDMzMDAz,size_16,color_FFFFFF,t_70)

在这里插入图片描述


评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小吕努力变强

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值