这篇文章继续帮助某些人快速回忆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>