关于bean:简述-Bean

 什么是 Bean 对于一般的 Java 对象,当 new 的时候创建对象,而后该对象就可能应用了。一旦该对象不再被应用,则由 Java 主动进行垃圾回收。 而 Spring 中的对象是 bean,bean 和一般的 Java 对象没啥大的区别,只不过 Spring 不再本人去 new 对象了,而是由 IoC 容器去帮忙咱们实例化对象并且治理它,咱们须要哪个对象,去问 IoC 容器要即可。IoC 其实就是解决对象之间的耦合问题,Spring Bean 的生命周期齐全由容器管制。 简而言之,bean 是由 Spring IoC 容器实例化、组装和治理的对象。 什么是 Spring Bean 的生命周期 • 一般的 Java 对象生命周期: 实例化 该对象不再被应用时通过垃圾回收机制进行回收 • Spring Bean 的生命周期: 实例化 Instantiation 属性赋值 Populate 初始化 Initialization 销毁 Destruction Spring Bean 的生命周期的扩大点 • Bean 本身的办法 实例化 -> 属性赋值 -> 初始化 -> 销毁 • 容器级的办法(BeanPostProcessor 一系列接口) 次要是后处理器办法,比方 InstantiationAwareBeanPostProcessor、BeanPostProcessor 接口办法。 这些接口的实现类是独立于 Bean 的,并且会注册到 Spring 容器中。 在 Spring 容器创立任何 Bean 的时候,这些后处理器都会产生作用。 • Bean 级生命周期办法 能够了解为 Bean 类间接实现接口的办法,比方 BeanNameAware、BeanFactoryAware、ApplicationContextAware、InitializingBean、DisposableBean 等办法,这些办法只对以后 Bean 失效。 如上为 Spring Bean 常识的回顾,如果遗记了,没关系,让咱们在代码中寻找记忆。 代码性能介绍 Application.java 启动类,实例化 spring 容器 AnnotationConfig.java 配置类,指定扫描门路 AnnotationApplicationContext.java 外围类,bean 创立、获取 BeanDefinition.java BeanDefinition 定义 SqBeanPostProcessor.java 后置处理器,初始化前后对 bean 进行干涉 User.java 业务类,用户对象,用户信息设置 UserService.java 业务类,用户 service,实现 BeanNameAware、InitializingBean spring 注解模仿 Autowired.java Component.java Lazy.java Scope.java ComponentScan.java spring 接口模仿 BeanNameAware.java BeanPostProcessor.java InitializingBean.java ...

February 29, 2024 · 1 min · jiezi

关于bean:Bean异步初始化让你的应用启动飞起来

如果你的系统启动耗时250s以上,文章思路应该能够帮到你。 一、背景近期,在做利用启动提速相干工作的过程中,咱们发现,利用启动速度次要的瓶颈在于bean的初始化过程(init,afterPropertiesSet办法的耗时)。很多中间件bean的初始化逻辑波及到网络io,且在没有相互依赖的状况下串行执行。将这一部分中间件bean进行异步加载,是晋升启动速度的一个摸索方向。 二、解决方案主动扫描可批量异步的中间件bean,而后,在bean的初始化阶段利用线程池并行执行其初始化逻辑。容许应用方自行配置耗时bean以享受异步减速能力。(需应用方自行确认依赖关系满足异步条件)三、原理3.1 异步初始化原理 3.1.1 如何异步init和afterPropertiesSet?3.1.1.1 这俩初始化办法在哪里执行的? 在AbstractAutowireCapableBeanFactory#invokeInitMethods办法(以下代码省略异样解决以及日志打印) protected void invokeInitMethods(String beanName, final Object bean, @Nullable RootBeanDefinition mbd) throws Throwable { // 先看bean是不是实现了InitializingBean,如果是则执行afterPropertiesSet办法。 boolean isInitializingBean = (bean instanceof InitializingBean); if (isInitializingBean && (mbd == null || !mbd.isExternallyManagedInitMethod("afterPropertiesSet"))) { if (System.getSecurityManager() != null) { AccessController.doPrivileged((PrivilegedExceptionAction<Object>) () -> { ((InitializingBean) bean).afterPropertiesSet(); return null; }, getAccessControlContext()); } else { ((InitializingBean) bean).afterPropertiesSet(); } } // xml定义的init办法 if (mbd != null && bean.getClass() != NullBean.class) { String initMethodName = mbd.getInitMethodName(); if (StringUtils.hasLength(initMethodName) && !(isInitializingBean && "afterPropertiesSet".equals(initMethodName)) && !mbd.isExternallyManagedInitMethod(initMethodName)) { invokeCustomInitMethod(beanName, bean, mbd); } }}调用位置图 ...

June 8, 2023 · 4 min · jiezi

关于bean:Spring中用注解创建bean实例

Spring中提供以下注解来创立bean实例:1)@Component2)@Service3)@Controller4)@Repository以上4个注解的性能是一样的,都能够用来创立bean实例 步骤:1)引入spring-aop依赖包2)开启注解扫描,开启后才会去扫描哪个目录下应用了注解 <context:component-scan base-package="com.zong.spring,com.zong.bean"></context:component-scan>应用过滤器,指定扫描文件 <context:component-scan base-package="com.zong.spring,com.zong.bean" use-default-filters="false"> //只扫描Controller注解 <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/> //不扫描Controller注解 <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/></context:component-scan>3)在类下面增加注解 @Component(value="userService")public class UserService{}value中的值等于bean.xml文件中的id属性,默认是类名且首字母小写

June 14, 2021 · 1 min · jiezi

关于bean:Spring中bean的生命周期

public class Others implements BeanPostProcessor{ public Others(){ //第一步 调用无参数的构造方法创立bean实例 } private String othername; public void setOtherName(String otherName){ //第二步 调用set办法设置属性 } public Object postProcessorBeforeInitialization(){ //第3.1步 初始化之前执行的办法 前置处理器 **留神会对bean.xml中所有bean都增加该处理器** } public void initMethod(){ //第三步 执行初始化办法 } public Object postProcessorAfterInitialization(){ //第3.2步 初始化之后执行的办法 后置处理器 } public void destoryMethod(){ //第五步 执行销毁办法 }}public void test(){ ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml"); Others others = context.getBean("others",Others.class); //第四步 获取创立Bean实例对象 ((ClassPathXmlApplicationContext) context).close;}<bean id="others" class="com.zong.spring.Others" init-method="initMethod" destory-method="destoryMethod">

June 14, 2021 · 1 min · jiezi