Spring的IOC的注解开发(******)
Spring的IOC的注解开发的入门
1、创建web项目,引入jar包
- 在Spring的版本中,除了引入基本的开发包以外,还需要引入aop的包
2、引入Spring的配置文件
- 在src下创建applicationContext.xml
- 引入约束:使用注解开发引入context约束
- 约束:spring-framework-4.2.4.RELEASE\docs\spring-framework-reference\html\xsd-configuration.html
3、创建接口和类
4、开启Spring的组件扫描
5、在类上添加注解
6、编写测试类
7、注解方式设置属性的值
- 注解方式:使用注解方式,可以没有set方法的。
- 属性如果有set方法,需要将属性注入的注解添加到set方法上。
- 属性如果没有set方法,需要将属性注入的注解添加到属性上。
Spring的IOC的注解的详解
@Component:组件
- 修是一个类,将这个类交给Spring管理。
- 这个注解有三个衍生注解(功能类似),修饰类。
- @Controller :web层
- @Service :service层
- @Repository :dao层
属性注入的注解
- 普通属性:
- @Value :设置普通属性的值
- 对象类型属性:
- @Autowired:设置对象类型的属性的值,但是按照类型完成属性注入。
- 我们习惯是按照名称完成属性注入:必须让@Autowired注解和@Qualifier一起使用完成按照名称属性注入。
- @Resource:完成对象类型的属性注入,按照名称完成属性注入。
- @Autowired:设置对象类型的属性的值,但是按照类型完成属性注入。
Bean的其他的注解
- 生命周期相关的注解(了解)
- @PostConstruct :初始化方法
- @PreDestroy :销毁方法
- Bean作用范围的注解
- @Scope :作用范围
- Singleton :默认单例
- prototype :多例
- request
- session
- globalsession
- @Scope :作用范围
IOC的XML和注解开发比较
XML和注解的比较
- 适用场景
- XML:可以适用任何场景
- 结构清晰,后期维护方便
- 注解:有些地方用不了,这个类不是自己提供的
- 开发方便
- XML:可以适用任何场景
XML和注解整合开发
- XML管理Bean,注解完成属性注入。(了解)
注意:在没有扫描的情况下,使用属性的注解:@Resource,@Value ,@Autowired,@Qualifier
<context:annotation-config/>
Spring的AOP的XML开发(******)
AOP的概述
什么是AOP
AOP:面向切面编程,AOP是OOP的扩展和延伸,解决OOP开发遇到的问题。
Spring底层的AOP实现原理
- 动态代理
- JDK动态代理:只能对实现了接口的类产生代理
- Cglib动态代理(类似于javassist第三方代理技术):对没有实现接口的类产生代理对象,生成子类对象。
JDK动态代理增强一个类中的方法:
public class MyJDKProxy implements InvocationHandler {
private UserDao userDao;
public MyJDKProxy(UserDao userDao) {
this.userDao = userDao;
}
// 编写工具方法:生成代理:
public UserDao createProxy(){
UserDao userDaoProxy = (UserDao) Proxy.newProxyInstance(userDao.getClass().getClassLoader(),userDao.getClass().getInterfaces(), this);
return userDaoProxy;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if("save".equals(method.getName())){
System.out.println("权限校验================");
}
return method.invoke(userDao, args);
}
}
Cglib动态代理增强一个类中的方法
public class MyCglibProxy implements MethodInterceptor{
private CustomerDao customerDao;
public MyCglibProxy(CustomerDao customerDao){
this.customerDao = customerDao;
}
// 生成代理的方法:
public CustomerDao createProxy(){
// 创建 Cglib 的核心类:
Enhancer enhancer = new Enhancer();
// 设置父类:
enhancer.setSuperclass(CustomerDao.class);
// 设置回调:
enhancer.setCallback(this);
// 生成代理:
CustomerDao customerDaoProxy = (CustomerDao) enhancer.create();
return customerDaoProxy;
}
@Override
public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
if("delete".equals(method.getName())){
Object obj = methodProxy.invokeSuper(proxy, args);
System.out.println("日志记录================");
return obj;
}
return methodProxy.invokeSuper(proxy, args);
}
}
Spring的AOP的开发(AspectJ的XML的方式)
Spring的AOP的简介
- AOP思想最早是由AOP联盟组织提出的,Spring是使用这种思想最好的框架。
- Spring的AOP有自己实现的方式(非常繁琐),AspectJ是一个AOP的框架,Spring引入AspectJ作为自身AOP开发。
- Spring两套AOP开发方式
- Spring传统方式(弃用)。
- Spring基于AspectJ的AOP的开发(使用)。
AOP开发中相关术语:
Joinpoint(连接点):指可以被拦截到的点(方法)。
- 增删改查的方法都可以被增强,这些方法就可以成为是连接点。
PointCut(切入点):真正被拦截到的点。
- 在实际开发中,只对save进行方法的增强,save称为切入点。
Advice(通知/增强):指拦截到JointPoint之后要做的事情就是通知。通知分为前置通知,后置通知,异常通知,最终通知,环绕通知。
- 对save方法进行权限校验,权限校验的方法称为通知
Introduction(引介):类层面的增强。
Target:被增强的对象。
- 对UserDao增强,UserDao称为是目标。
Weaving(织入):将通知(Advice)应用到目标(Target)的过程
- 将权限校验的方法的代码应用到UserDao的save方法上的过称。
Proxy:代理对象。
AspectJ(切面):多个通知和多个切入点组合。
Spring的AOP的入门(AspectJ的XML方式)
1、创建web项目,引入jar包
- 引入基本开发包
- 引入aop开发的相关jar包
2、引入Spring的配置文件
- 引入aop的约束
3、编写目标类并完成配置
4、编写测试类:
- Spring整合Junit单元测试
5、编写一个切面类
- 编写切面类
- 将切面类交给Spring
6、通过AOP的配置实现
Spring中通知类型
前置通知:在目标方法执行之前进行操作
- 获得切入点信息
后置通知:在目标方法执行之后进行操作
- 获得方法的返回值
环绕通知:在目标方法执行之前和之后进行操作
- 可以阻止目标方法的执行
异常抛出通知:在程序出现异常的时候,进行的操作
最终通知:无论代码是否有异常,总是会执行
Spring的切入点表达式写法:
切入点表达式语法:
- 基于execution的函数完成的
- 语法:
- [访问修饰符] 方法返回值 包名.类名.方法名(参数)
- public void com.it.spring.UserDao.save(..)
- * *.*.*.*Dao.save() //所有Dao里的save都可以被增强
- * com.it.spring.UserDao+.save() // +代表当前的类和其子类
- * com.it.spring..*.*(..) //com.it.spring包以及其子包下的所有类的所有方法都可以被增强
- [访问修饰符] 方法返回值 包名.类名.方法名(参数)