proxyBeanMenthod
假设我们要进行一个系统的二次开发
然后第一次开发我们实用的是XML声明bean
二次开发的时候要用注解
我们如何把bean都加载上来呢
我们首先创建一个全新的配置类
package com.bigdata1421.config;public class SpringConfig32 {
}
我们创建一个APP
加载配置类
拿到bean并且打印
package com.bigdata1421.bean.app;import com.bigdata1421.config.SpringConfig3;
import com.bigdata1421.config.SpringConfig32;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class App32 {public static void main(String[] args) {ApplicationContext ctx=new AnnotationConfigApplicationContext(SpringConfig32.class);String[] arr = ctx.getBeanDefinitionNames();for (String s : arr) {System.out.println(s);}}}
我们接下来就尝试
在启动SpringConfig32的时候
不仅要加载自己在类里面书写的配置
还要加载xml文件里的配置
我们只需要这一个注解就行
package com.bigdata1421.config;import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.ImportResource;@ImportResource("applicationContext1.xml")
public class SpringConfig32 {
}
spring内部最终就可以把这两个配置信息
组合到一个容器里面
这样就搞定了
这就是教我们系统迁移怎么做
小结
拓展
应该是在代理类里面做了方法增强,所以拿到的就是同一个对象
proxyBeanMethods
如果是true
就直接一开始创建了一个bean 然后进入spring容器里面去找bean
用事先就创建好的对象去调用方法 即返回同一个bean
如果是false
就每次执行都要去用对象执行方法
生成一个全新的对象 覆盖
我们看以前的代码
就可以进行解释
在这个类里面
你只要是运行这个方法
得到的对象就是容器中取得bean
如果关掉
就根本就是spring容器中的对象 而是你new出来的
小结小结小结
补充
动态代理是面向对象编程中的一种重要技术,它允许在运行时创建一个实现特定接口或一组接口的代理类对象,而无需显式编写这些类的实现代码。在Java中,动态代理主要通过Java反射机制实现,它通常与代理模式和AOP(面向切面编程)结合使用,以实现横切关注点的分离和增强功能。
Java中动态代理的实现方式:
-
Java反射机制:
-
Java的反射机制允许在运行时检查类、接口、方法和字段,并在运行时创建对象、调用方法、获取或设置字段值等。
-
动态代理就是利用反射机制在运行时动态生成代理类的技术。
-
-
代理类生成:
-
Java动态代理通常使用
java.lang.reflect.Proxy
类实现。 -
首先定义一个接口或者获取一个接口的引用,然后使用
Proxy.newProxyInstance()
方法创建代理类实例。
-
-
InvocationHandler接口:
-
实现动态代理需要一个实现
InvocationHandler
接口的类,该接口包含一个方法invoke(Object proxy, Method method, Object[] args)
,在代理对象调用方法时被调用。 -
在
invoke()
方法中,可以定义对原始方法调用的增强逻辑,例如添加日志、性能监控、事务处理等。
-
-
应用场景:
-
AOP(面向切面编程):动态代理常用于实现AOP,通过代理类包装业务逻辑,实现横切关注点的分离。
-
远程方法调用(RMI):动态代理可以用于创建远程对象的本地代理,隐藏远程调用的具体实现细节。
-
延迟加载(Lazy Loading):动态代理可以延迟加载对象,当真正需要使用时再实例化对象。
-
-
局限性:
-
动态代理只能代理接口,无法直接代理类。
-
由于使用了反射机制,动态代理可能会带来一定的性能开销。
-
Spring容器是Spring Framework的核心部分,它负责管理应用中的组件(beans)并协调它们的生命周期和配置。Spring容器的主要功能包括:
-
依赖注入(Dependency Injection,DI):Spring容器通过依赖注入将组件之间的依赖关系动态地注入到组件中,从而实现了松耦合。
-
AOP(Aspect-Oriented Programming,面向切面编程):Spring容器支持AOP,允许开发者通过切面来实现跨越应用逻辑的功能,如事务管理、日志记录等。
-
事务管理:Spring容器提供了强大的事务管理支持,可以轻松地在应用中管理事务,支持声明式事务配置。
-
简化JDBC操作:Spring提供了JDBC模板(JdbcTemplate)等工具类,简化了数据库操作,减少了样板代码。
-
事件发布和监听:Spring容器支持事件驱动模型,可以发布事件并允许其他组件监听这些事件,实现了解耦和增强灵活性。
-
面向接口编程:Spring鼓励面向接口编程,通过接口来实现依赖注入,使得代码更易于测试和维护。
Spring容器主要有两种类型:BeanFactory和ApplicationContext。ApplicationContext是BeanFactory的子接口,提供了更多的企业级功能,如国际化、事件传播等,是在大多数应用中推荐使用的容器类型。
总体来说,Spring容器是Spring框架的核心,它通过依赖注入和面向切面编程等特性,极大地简化了Java应用的开发和维护工作。
proxyBeanMethods
是Spring框架中的一个配置选项,它主要用于控制Spring Boot中@Configuration类的代理行为。在Spring中,通常使用@Configuration注解来标记一个类,表示这是一个配置类,可以包含@Bean方法用于定义Spring Bean。
作用和用法:
-
默认行为:
-
默认情况下,Spring会对@Configuration类进行CGLIB代理,以确保@Bean方法的调用可以被拦截,从而管理@Bean方法返回的实例的生命周期和依赖关系。
-
-
proxyBeanMethods选项:
-
proxyBeanMethods = true
:这是Spring Boot 2.2版本引入的默认值。表示Spring会对@Configuration类进行代理,以支持方法调用的拦截和依赖管理。 -
proxyBeanMethods = false
:这个选项告诉Spring不要对@Configuration类进行代理。这在某些情况下可以提高性能,尤其是当@Configuration类中的@Bean方法很简单,不涉及复杂的依赖关系时。
-
-
性能考虑:
-
当
proxyBeanMethods = false
时,Spring不会为@Configuration类生成代理,这意味着@Bean方法的调用将直接返回实例,不经过Spring的AOP拦截器和增强处理,可以提高应用程序的启动性能和运行时性能。 -
当
proxyBeanMethods = true
时,虽然增加了一些性能开销,但可以确保@Bean方法的各种功能(如AOP切面、依赖注入等)得到正确的支持和管理。
-
-
配置方式:
-
在Spring Boot中,可以通过在@Configuration类上使用
@Configuration(proxyBeanMethods = true)
或者@Configuration(proxyBeanMethods = false)
来显式指定代理行为。
-
-
建议:
-
通常情况下,使用默认的
proxyBeanMethods = true
是比较安全的选择,因为它保证了Spring框架的各种功能可以正常工作。只有在确实需要优化性能时,才考虑将其设置为false
。
-
在Spring框架中,确保@Bean方法的调用可以被拦截意味着Spring容器能够拦截对@Configuration类中@Bean方法的调用,并在需要时执行一些额外的逻辑或者处理。
具体来说,对@Configuration类中@Bean方法的拦截可以实现以下几个方面的功能:
-
AOP切面:
-
Spring框架支持通过AOP(面向切面编程)拦截@Bean方法的调用。这意味着你可以使用切面来在方法执行前后执行额外的逻辑,比如日志记录、性能监控、安全性检查等。
-
-
依赖注入:
-
当@Bean方法返回的对象有依赖其他Spring管理的Bean时,Spring需要拦截@Bean方法的调用,以确保依赖的Bean可以被正确注入。
-
-
单例管理:
-
Spring默认情况下会将@Configuration类中@Bean方法返回的对象作为单例管理,即每次调用@Bean方法返回的是同一个实例。这需要Spring能够拦截@Bean方法的调用,并按照单例的要求进行管理。
-
-
条件化Bean的注册:
-
通过条件化的方式,可以根据一定条件决定是否注册某些@Bean方法返回的Bean实例。Spring在拦截@Bean方法时,可以根据条件进行判断,从而控制Bean的注册。
-
-
Bean生命周期管理:
-
Spring框架负责管理@Bean方法返回的Bean的生命周期,包括初始化和销毁阶段。拦截@Bean方法的调用是确保Spring可以在需要时执行这些生命周期管理操作的关键。
-
总体来说,Spring框架通过拦截@Configuration类中@Bean方法的调用,能够实现对Bean的完整管理和控制,包括依赖注入、生命周期管理、AOP增强等。这种机制确保了Spring的IoC(控制反转)和DI(依赖注入)特性能够正常工作,使得开发者能够专注于业务逻辑的实现而不必关心底层的管理和维护工作。
个人号推广
博客主页
多多!-CSDN博客
Web后端开发
https://blog.csdn.net/qq_30500575/category_12624592.html?spm=1001.2014.3001.5482
Web前端开发
https://blog.csdn.net/qq_30500575/category_12642989.html?spm=1001.2014.3001.5482
数据库开发
https://blog.csdn.net/qq_30500575/category_12651993.html?spm=1001.2014.3001.5482
项目实战
https://blog.csdn.net/qq_30500575/category_12699801.html?spm=1001.2014.3001.5482
算法与数据结构
https://blog.csdn.net/qq_30500575/category_12630954.html?spm=1001.2014.3001.5482
计算机基础
https://blog.csdn.net/qq_30500575/category_12701605.html?spm=1001.2014.3001.5482
回忆录
https://blog.csdn.net/qq_30500575/category_12620276.html?spm=1001.2014.3001.5482