spring:注解配置、aop

时间:2022-12-16 06:12:28

使用注解配置spring

步骤

1导包4(基本)+2(日志)+spring-aop

2.为主配置文件引入新的命名空间(约束)

spring:注解配置、aop


spring:注解配置、aop
spring:注解配置、aop

3.开启使用注解代理配置文件

spring:注解配置、aop

4.在类中使用注解完成配置



将对象注册到容器

spring:注解配置、aop


修改对象的作用范围

spring:注解配置、aop


值类型注入

通过反射的Field赋值,破坏了封装性

spring:注解配置、aop

通过set方法赋值,推荐使用.

spring:注解配置、aop

引用类型注入

spring:注解配置、aop

spring:注解配置、aop

重点

spring:注解配置、aop


初始化|销毁方法

spring:注解配置、aop
package cn.itcast.bean;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.annotation.Resource;
import javax.xml.ws.RespectBinding;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service;

//<bean name="user" class="cn.itcast.bean.User" />
//@Component("user")
// @Service("user") // service层
// @Controller("user") // web层
@Repository("user")// dao层
//指定对象的作用范围
@Scope(scopeName="singleton")
public class User {
private String name;
@Value("18")
private Integer age;

//@Autowired //自动装配
//问题:如果匹配多个类型一致的对象.将无法选择具体注入哪一个对象.
//@Qualifier("car2")//使用@Qualifier注解告诉spring容器自动装配哪个名称的对象

@Resource(name="car")//手动注入,指定注入哪个名称的对象
private Car car;

public Car getCar() {
return car;
}
public void setCar(Car car) {
this.car = car;
}
public String getName() {
return name;
}
@Value("tom")
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@PostConstruct //在对象被创建后调用.init-method
public void init(){
System.out.println("我是初始化方法!");
}
@PreDestroy //在销毁之前调用.destory-method
public void destory(){
System.out.println("我是销毁方法!");
}
@Override
public String toString() {
return "User [name=" + name + ", age=" + age + ", car=" + car + "]";
}

}

STS插件

安装失败率高:版本号必须匹配成关键
1.查看eclipse版本号
2.去sts下载对应离线包 .zip
3.eclipse中安装离线包
spring:注解配置、aop

spring与junit整合测试

1.导包4+2+aop+test

2.配置注解

spring:注解配置、aop

3.测试

spring:注解配置、aop

spring中的aop

aop思想介绍

spring:注解配置、aop
spring:注解配置、aop
spring:注解配置、aop

spring中的aop概念

spring:注解配置、aop

spring实现aop的原理


动态代理(优先)

被代理对象必须要实现接口,才能产生代理对象.如果没有接口将不能使用动态代理技术

cglib代理(没有接口)

第三方代理技术,cglib代理.可以对任何类生成代理.代理的原理是对目标对象进行继承代理. 如果目标对象被final修饰.那么该类无法被cglib代理.


动态代理:

package cn.itcast.c_proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

import cn.itcast.service.UserService;
import cn.itcast.service.UserServiceImpl;
//观光代码=>动态代理
public class UserServiceProxyFactory implements InvocationHandler {

public UserServiceProxyFactory(UserService us) {
super();
this.us = us;
}

private UserService us;

public UserService getUserServiceProxy(){
//生成动态代理
UserService usProxy = (UserService) Proxy.newProxyInstance(UserServiceProxyFactory.class.getClassLoader(),
UserServiceImpl.class.getInterfaces(),
this);
//返回
return usProxy;

}

@Override
public Object invoke(Object arg0, Method method, Object[] arg2) throws Throwable {//代理对象,目标对象方法字节码对象,方法参数
System.out.println("打开事务!");
Object invoke = method.invoke(us, arg2);
System.out.println("提交事务!");
return invoke;
}

}

cglib代理

package cn.itcast.c_proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

import org.springframework.cglib.proxy.Callback;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

import cn.itcast.service.UserService;
import cn.itcast.service.UserServiceImpl;

//观光代码=>cglib代理
public class UserServiceProxyFactory2 implements MethodInterceptor {


public UserService getUserServiceProxy(){

Enhancer en = new Enhancer();//帮我们生成代理对象

en.setSuperclass(UserServiceImpl.class);//设置对谁进行代理

en.setCallback(this);//代理要做什么

UserService us = (UserService) en.create();//创建代理对象

return us;
}

@Override
public Object intercept(Object obj, Method method, Object[] arg, MethodProxy methodProxy) throws Throwable {
//原始对象、代理方法、参数、原始方法
//打开事务
System.out.println("打开事务!");
//调用原有方法
Object returnValue = methodProxy.invokeSuper(obj, arg);
//提交事务
System.out.println("提交事务!");

return returnValue;
}


}

测试:

package cn.itcast.c_proxy;

import org.junit.Test;

import cn.itcast.service.UserService;
import cn.itcast.service.UserServiceImpl;

public class Demo {

@Test
//动态代理
public void fun1(){
UserService us = new UserServiceImpl();

UserServiceProxyFactory factory = new UserServiceProxyFactory(us);

UserService usProxy = factory.getUserServiceProxy();

usProxy.save();

//代理对象与被代理对象实现了相同的接口
//代理对象 与 被代理对象没有继承关系
System.out.println(usProxy instanceof UserServiceImpl );//false
}

@Test
public void fun2(){

UserServiceProxyFactory2 factory = new UserServiceProxyFactory2();

UserService usProxy = factory.getUserServiceProxy();

usProxy.save();

//判断代理对象是否属于被代理对象类型
//代理对象继承了被代理对象=>true
System.out.println(usProxy instanceof UserServiceImpl );//true
}
}

aop名词学习

spring:注解配置、aop



spring中的aop演示

步骤(xml配置)

1.导包4(基本)+2(日志)+2(spring的aop包)+2(spring需要第三方aop包)

spring的aop包:

spring-aspects-4.2.4.RELEASE.jar

spring-aop-4.2.4.RELEASE.jar

spring需要第三方aop包:

com.springsource.org.aopalliance-1.0.0.jar

com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar


2.准备目标对象

spring:注解配置、aop

3.准备通知


spring:注解配置、aop

spring:注解配置、aop

4.配置进行织入,将通知织入目标对象中

spring:注解配置、aop
spring:注解配置、aop

步骤(注解配置)


1.导包4(基本)+2(日志)+2(spring的aop包)+2(spring需要第三方aop包)

spring的aop包:

spring-aspects-4.2.4.RELEASE.jar、spring-aop-4.2.4.RELEASE.jar

spring需要第三方aop包:

com.springsource.org.aopalliance-1.0.0.jar、com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar

2.准备目标对象

spring:注解配置、aop

3.准备通知


spring:注解配置、aop

spring:注解配置、aop

4.配置进行织入,将通知织入目标对象中

spring:注解配置、aop

spring:注解配置、aop

spring:注解配置、aop


复习


一.注解代替xml配置
准备工作:
4+2 + spring-aop包
xml中导入context约束
在xml中开启扫描包中类的注解
注解:
@Component("BeanName") 将对象注册到spring容器
|- @Controler
|- @Service
|- @Repository

@Scope 指定对象的作用范围
|- singleton
|- prototype

@Value 值类型属性注入

@Autowired 自动属性注入.根据类型注入.
@Qulifier 指定注入的对象的名称

@Resource 指定对象的名称注入

@PostConstruct 初始化方法
@PreDestory    销毁方法


二.spring AOP开发

aop思想: 纵向重复,横向抽取.
|- filter中
|- 动态代理
|- interceptor中

spring AOP: 封装了动态代理技术.来体现aop.


springaop实现: 可以对所有对象进行代理
|- 动态代理 代理需要实现接口.
|- cglib代理 对目标对象继承代理.

springaop名词:
join point: 连接点.所有可以织入通知的方法.
point cut : 切入点.需要|已经织入通知的方法.
advice: 需要增强的代码.
weaving: 动词.将通知应用的切点的过程.
target: 目标对象.
proxy: 代理对象
aspect: 切面. 切入点+通知

步骤:
1.导包
4+2
2 aop+aspect
2 aop联盟+weaving
2.准备目标对象


3.准备通知类
前置通知
后置通知 方法正常结束
环绕通知
异常拦截通知
后置通知 无论如何都执行

4.配置文件中配置,导入aop约束
1>目标对象
2>通知对象
3><aop:config>
<aop:ponint-cut id="切点名称" expression="execution(切点表达式)" />
<aop:aspect ref="通知对象名称" >
<aop:before method="" ponintcut-ref=""  />
<aop:after-returning method="" ponintcut-ref=""  />
<aop:around method="" ponintcut-ref=""  />
<aop:after-throwing method="" ponintcut-ref=""  />
<aop:after method="" ponintcut-ref=""  />
</aop:aspect>

扩展:使用注解完成aop
1.导包
4+2
2 aop+aspect
2 aop联盟+weaving
2.准备目标对象


3.准备通知类
4.配置文件中配置,导入aop约束
1>目标对象
2>通知对象
3><aop:aspect-autoproxy> 开启注解aop

5.注解
@Aspect 指定当前类是通知类

@Before 前置通知方法
@after-returning 后置通知方法
@around 环绕通知方法
@after-throwing 异常拦截通知方法
@after 后通知方法

@PointCut 抽取切点表达式