ing容器托管,注册到容器中,因为他本来就是一个@Component
//@Configuration 代表这是一个配置类,就和我们之前看的beans.xml是一样的
@ComponentScan("com.ws")
@Import(UserConfig2.class)
public class UserConfig {
//注册一个bean,就相当于之前写的一个bean标签
//这个方法的名字就相当于bean标签中的id属性
//这个方法的返回值就相当于bean标签中的class属性
@Bean
public User getUser() {
//就是返回要注入到bean中的对象!
return new User();
}
测试类:
public class MyTest {
public static void main(String[] args) {
//如果完全使用了配置类方式去做,我们就只能通过AnnotationConfig 上:下文来获取容器,通过配置类的cLass对象加载!
ApplicationContext context = new AnnotationConfigApplicationContext(UserConfig.class);
User user =(User) context.getBean("getUser");
System.out.println(user.getName());
}
}
这种纯Java的配置文件,在SpringBoot中随处可见!
9、代理模式
为什么要学习代理模式?因为就是SpringAOP的底层!【SpringAOP 和 SpringMVC】
代理模式:
9.1、静态代理
角色分析:
- 抽象角色 ︰ 一般会使用接口或者抽象类来解决
- 真实角色 ︰ 被代理的角色
- 代理角色 ∶ 代理真实角色,代理真实角色后,我们一般会做一些附属操作
- 客户 : 访问代理对像的人!
代码步骤:
1.接口
/**
* @author 平卉陌路
*/
public interface Rent {
//出租房屋
public void rent();
}
2.真实角色
/**
* @author 平卉陌路
*/
public class Host implements Rent{
@Override
public void rent() {
System.out.println("房东要出租房子!");
}
}
3.代理角色
/**
* @author 平卉陌路
*/
public class Proxy implements Rent{
private Host host;
public Proxy() {
}
public Proxy(Host host) {
this.host = host;
}
@Override
public void rent() {
host.rent();
seeHouse();
signAgreement();
free();
}
//看房
public void seeHouse(){
System.out.println("中介带你看房!");
}
//签合同
public void signAgreement(){
System.out.println("签租赁合同");
}
//收中介费
public void free(){
System.out.println("收中介费");
}
}
4.客户端访问代理角色
/**
* @author 平卉陌路
*/
public class Client {
public static void main(String[] args) {
//房东要出租房子
Host host = new Host();
/*host.rent();*/
//代理,中介帮房东出租房子,但中介会有一些附属操作
Proxy proxy = new Proxy(host);
//你不用面对房东,找中介租房即可!
proxy.rent();
}
}
代理模式的好处:
- 可以使真实角色的操作更加纯粹!不用去关注一些公共的业会公共也就就交给代理角色!
- 实现了业务的分工!
- 公共业务发生扩展的时候,方便集中管理!
缺点:
- 一个真实角色就会产生一个代理角色;代码量会翻倍开发效率会变低
9.2、加深理解
聊聊横向AOP开发:
9.3、动态代理
- 动态代理和静态代理角色一样
- 动态代理的代理类是动态生成的,不是我们直接写好的!
- 动态代理分为两大类:基于接口的动态代理,基于类的动态代理
- 基于接口---JDK动态代理 ----【我们在这里使用】
- 基于类:cglib
- java字节码实现: javasist
需要了解两个类: Proxy:代理,InvocationHandler:调用处理程序
动态代理的好处:
- 可以使真实角色的操作更加纯粹!不用去关注一些公共的业务
- 公共也就就交给代理角色!实现了业务的分工!
- 公共业务发生扩展的时候,方便集中管理!
- 一个动态代理类代理的是一个接口,一般就是对应的一类业务。
- 一个动态代理类可以代理多个类,只要是实现了同一个接口即可!
10、AOP
10.1、什么是AOP
AOP (Aspect Oriented Programming)意为: 面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
10.2 、Aop在Spring中的作用
提供声明式事务;允许用户自定义切面。
- 横切关注点:跨越应用程序多个模块的方法或功能。即是,与我们业务逻辑无关的,但是我们需要关注的部分,就是横切关注点。如日志,安全,缓存,事务等等....
- 切面(ASPECT)︰横切关注点被模块化的特殊对象。即,它是一个类。
- 通知(Advice) :切面必须要完成的工作。即,它是类中的一个方法。
- 目标(Target)︰被通知对象。
- 代理(Proxy)∶向目标对象应用通知之后创建的对象。
- 切入点(PointCut):切面通知执行的“地点"的定义。
- 连接点(JointPoint):与切入点匹配的执行点。
SpringAOP中,通过Advice定义横切逻辑,Spring中支持5种类型的Advice:
即Aop在不改变原有代码的情况下,去增加新的功能.
10.3、使用Spring实现Aop【重点】
使用AOP织入,需要导入一个依赖包!
<!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.5</vers