Spring快速回忆(二)

这篇文章继续帮助某些人快速回忆Spring


一、依赖注入(Spring DI)

1).构造器注入

通过构造器注入属性,当然前提是Bean得有有参构造。

    <!-- 通过构造器参数名称方式依赖注入 -->
<bean id="getcon3" class="xxx.xxx.BeanDemo">
    <constructor-arg name="id" value="1"/>  
    <constructor-arg name="name" value="Hello word!!!"/>
</bean>

除此之外还可以通过通过:构造器索引参数方式来实现依赖注入、根据参数类型进行注入。

2).Setter注入
a.注入常量
 <!-- 通过set方法来注入依赖 -->
    <bean id="setType" class="xxx.xxx.xxxBeanDemo">  
        <property name="name" value="Hello World!"/>  
        <property name="id">  
            <value>1</value>  
        </property>  
    </bean> 
b.注入集合
<!--注入list集合<String>--!>
<property name="namelist">
    <list value-type="java.lang.String">
        <value>小王</value>
        <value>大王</value>
        <value>老王</value>
    </list>
</property>

 <!--注入list集合<Object>--!>
<property name="orderlist">
    <list value-type="com.project.bean.OrderBean">
        <ref bean="order1"/>
        <ref bean="order2"/>
    </list>
 </property>
c.注入集合
   <!--注入map:<String,String>--!>
<property name="namemap">
   <map key-type="java.lang.String" value-type="java.lang.String">
        <entry key="one" value="xiaowang"></entry>
        <entry key="two" value="xiaoqing"></entry>
   </map>
</property>

   <!--注入map:<String,Object>--!>    
<property name="ordermap">
   <map key-type="java.lang.String" value-type="xxx.xxx.BeanDemo">
        <entry key="one" value-ref="order1"></entry>
        <entry key="two" value-ref="order2"></entry>
    </map>
</property>

二、Spring AOP

aop是由aop联盟设计的,spring是aop的一个实现框架。在使用前需要导入jar包 spring-aop-4.2.8.RELEASE.jar

1 . 通知类型(还有个异常通知)
a).前置通知类
public class MyAdviceBefore implements MethodBeforeAdvice{

    @Override
    public void before(Method arg0, Object[] arg1, Object arg2)
            throws Throwable {
        System.out.println("前置通知");     
    }
}
b).后置通知类
public class MyAdviceAfter implements AfterReturningAdvice{

    @Override
    public void afterReturning(Object returnValue, Method method,
            Object[] args, Object target) throws Throwable {
        //returnValue 返回值,可以获取到值,但是无法返回
        System.out.println("后置通知");    
    }
}
c).环绕通知类
public class MyInterceptorAdvice implements MethodInterceptor{

   // 返回值Object实际上就是将目标对象增强后,返回目标对象方法的返回值
    @Override
    public Object invoke(MethodInvocation invocation) throws Throwable {

        System.out.println("前置通知");
        //执行目标对象方法
        Object result = invocation.proceed();
        System.out.println("后置通知");

        return result;
    } 
}

2 . 通知&&顾问的xml配置!

a).通知在xml中的配置情况入下:

一个实现类 注入一个通知,注入的时间由通知定义

<!-- 注入user实现类 -->
<bean id="userService" class="com.project.service.impl.UserServiceImpl"></bean>

    <!-- 注入通知 -->
<bean id="myAdvice" class="com.project.aop.beforeAdvice.MyAdviceBefore"></bean>

    <!-- 定义工厂类,目的是为了产生动态代理对象 -->
<bean id="proxyUserService" class="org.springframework.aop.framework.ProxyFactoryBean">
        <!-- 这种是获取到目标对象 -->
        <property name="target" ref="userService"></property>
        <!-- 在注入通知类 -->
        <property name="interceptorNames" value="myAdvice"></property>
</bean>
b).顾问在xml中的配置情况入下:

advice通知,主要是指定注入的时间(前置通知,后置通知)。使用通知所有的连接点都变成了切入点。如果现在我们想指定哪些切入点,那就需要用到顾问。

实现方式有两种:

1.NameMatchMethodPointcutAdvisor接口通过名字来指定
2.RegexpMethodPointcutAdvisor接口通过正则表达式匹配名字

(1)通过名字指定
<bean id="userService" class="com.project.aop02.advice.UserServiceImpl"></bean>

    <!-- 注入通知 -->
    <bean id="myAdvice1" class="com.project.aop02.advice.MyBeforeAdvice"></bean>
    <bean id="myAdvice2" class="com.project.aop02.advice.MyAfterAdvice"></bean>

    <!-- 注入顾问 ,通过名称来实现-->
    <bean id="myadvisor" class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor">
        <!-- 设置通知 -->
        <property name="advice" ref="myAdvice1"></property>
        <!-- 设置切入点 -->
        <property name="mappedNames" value=“login,register”></property>
    </bean>

    <!-- 定义工厂类,目的是为了产生动态代理对象 -->
    <bean id="proxyUserService" class="org.springframework.aop.framework.ProxyFactoryBean">
        <!-- 这种是获取到目标对象的名称 -->
        <property name="targetName" value="userService"></property>
        <!-- 注入顾问 -->
        <property name="interceptorNames" value="myadvisor"></property>
    </bean>
(2)通过正则表达式指定
<bean id="myadvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
    <!-- 设置通知 -->
    <property name="advice" ref="myAdvice1"></property>
    <!-- 设置正则表达式来匹配 patterns表示匹配多个方法 -->
    <property name="patterns" value=".*login.*,.*register.*"></property>
</bean>
c).为了更加灵活的设置切入点,可以使用自动代理生成器!
(1).自动代理生成器(全自动):

所有顾问自动的根据名称或者正在表达式
去匹配所有类里面的所有方法织入连接点!!!

  <bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"></bean>
(2).Bean名称自动代理生成器(半自动):

指定顾问,指定类名,匹配所要织入的连接点!!!

<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
    <!-- 可以指定哪些类需要生成代理类 -->
    <property name="beanNames" value="userService1,userService2"></property>
    <!-- 指定通知或者顾问 -->
    <property name="interceptorNames" value="myadvisor"></property>
</bean>

猜你喜欢

转载自blog.csdn.net/RanChaoCong/article/details/81706231