Spring实现依赖注入有哪几种方式?
有4种依赖注入方式:
- Set方法注入:注入是最简单、最常用的注入方式,支持注解+xml。
- 构造器注入:是指带有参数的构造函数注入,支持注解+xml。
- 静态工厂的方法注入:通过调用静态工厂的方法来获取自己需要的对象,只支持xml。
- 实例工厂的方法注入:获取对象实例的方法不是静态的,所以你需要首先new工厂类,再调用普通的实例方法,只支持xml。
有2 种实现方式:
- 注解(如@Autowired,@Resource,@Required)
- 配置文件(如xml)
代码演示:
1.set-注解方式
public class UserService {
//注解注入(autowire注解默认使用类型注入)
@Autowired //【看这里】
private UserDao userDao;
public void login() {
userDao.login();
}
}
2.set-xml
<bean name="userService" class="com.obob.service.UserService">
<property name="userDao" ref="userDao" /><!--这里是property-->
</bean>
<bean name="userDao" class="com.obob.dao.UserDao"></bean>
3.构造-注解方式
public class UserService {
private UserDao userDao;
//注解到构造方法处
@Autowired //【看这里】
public UserService(UserDao userDao) {
this.userDao = userDao;
}
public void login() {
userDao.login();
}
}
4.构造-xml方式
<bean name="userService" class="com.obob.service.UserService">
<constructor-arg index="0" ref="userDao"></constructor-arg> <!--这里是constructor-arg-->
</bean>
<bean name="userDao" class="com.obob.dao.UserDao"></bean>
5.静态工厂-xml
<bean name="userService" class="com.obob.service.UserService">
<property name="staticUserDao" ref="staticUserDao" /><!--property属性-->
</bean>
<!--UserDao staticUserDao=Factory.initUserDao() -->
<bean name="staticUserDao" class="com.obob.Factory" factory-method="initUserDao"></bean>
6.实例工厂-xml
<bean name="userService" class="com.obob.service.UserService">
<property name="staticUserDao" ref="staticUserDao" />
</bean>
<!--UserDao staticUserDao=factory.initUserDao() -->
<bean name="staticUserDao" factory-bean="factory" factory-method="initUserDao"></bean>
<!--Factory factory = new Factory() -->
<bean name="factory" class="com.obob.Factory"></bean>
7.了解@bean的方式
@Configuration
public class AppConfig {
// 使用@Bean 注解表明myBean需要交给Spring进行管理
// 未指定bean 的名称,默认采用的是 "方法名" + "首字母小写"的配置方式
@Bean
public MyBean myBean(){
return new MyBean();
}
}
Spring有哪些增强类型?并分别说明有哪些特点?
1 增强类型
Spring中提供的增强类包含两类1.Spring定义的扩展增强 2.aoppalliance定义的扩展增强
其中Spring提供的扩展增强主要针对于方法即方法级增强,aoppalliace即提供了方法级的增强(MethodInterceptor)也提供引介增强(IntroductionInterceptor),引介增强可以给类添加属性和行为所以引介增强属于类级别
1.1 前置增强
顾名思义就是在目标方法执行前织入增强。BeforeAdvice表示前置增强。属于Spring提供的增强所以属于方法级增强。MethodBeforeAdvice为目前可用前置增强。
1.2 后置增强
顾名思义就是在目标方法执行后织入增强。AfterReturningAdvice表示后置增强。属于Spring提供的增强所以属于方法级增强。
1.3 环绕赠强
MethodInterceptor是前置增强和后置增强的综合,在目标方法执行前后都织入增强。可以用该增强替换前置增强和后置增强
1.4 异常抛出增强
ThrowsAdvice表示在目标方法抛出异常时实施增强
1.5 引介增强
IntroductionInterceptor在目标类中添加属性和行为
2 ProxyFactory简介
通过编码的方式实现增强时需要使用ProxyFactory,ProxyFactory底层采用JDK或者CGLib动态代理将对应的增强织入到目标方法或者类中。
AopProxy提供了两个final的实现类
1.Cglib2AopProxy:针对类的代理
2.JdkDynamicAopProxy:针对接口的代理
如果ProxyFactory#setInterfaces(Class[])指定了需要代理的接口,那么ProxyFactory使用JdkDynamicAopProxy,否则使用Cglib2AopProxy.可以通过ProxyFactory#setOptimize(true)让ProxyFactory启动优化代理方式,这样使用接口的代理也可以使用Cglib2AopProxy。通过ProxyFactory#addAdvice(Advice)或者ProxyFactory#addAdvice(int index,Advice)向目标对象中添加增强,其中index为增强的顺序,顺序的序列号从0开始。按照添加顺序执行或者index指定的顺序执行。index值越小对应的增强优先执行
SpringAop三种配置方式?
AOP
什么是AOP
Aop(Asoect Oriented Programming)意味:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术,AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型,利用AOP可以对业务逻辑各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
AOP在Spring中的作用
提供声明式事务:允许用户自定义切面
- 横切关注点:跨越应用程序多个模块的方法或功能,即是,与我们业务逻辑无关的,但是我们需要关注的部分,就是横切关注点。如日志,安全,缓存,事务等待。。。
- 切面:横切关注点被模块化的特殊对象,即它是一个类。
- 通知:切面必须要完成的工作,即他是类中的一个方法。
- 目标:被通知对象。
- 代理:向目标对象应用通知之后创建的对象。
- 切入点:切面通知执行的地点的定义。
- 连接点:与切入点匹配的执行点。
使用Spring实现AOP的三种方式
- 方式一:使用Spring的API接口【主要SpringAPI接口实现】
- 方式二:自定义来实现AOP [主要是切面定义]
- 方式三:使用注解