首页 > 其他分享 >Spring

Spring

时间:2024-03-18 18:30:29浏览次数:28  
标签:构造方法 对象 Spring bean 代理 Bean

Bean的生命周期

UserService.class ---> 无参数构造方法 (推断构造方法) ---> 普通对象 ---> 依赖注入(属性赋值) ---> 判断是否有Aware回调--->初始化前 (@PostConstruct) ---> 初始化 (InitializingBean) ---> 初始化后 (AOP) ---> 代理对象 ---> Bean

1、UserService.class

使用@Bean或者@Component来将此类声明为bean

@Component
public class UserService { //beanName为userService
​
     @Autowired
     OrderService OrderService; //beanName为orderService
}

UserService声明为bean,需要从Spring容器中注入OrderService的bean。

2、无参数构造方法 (推断构造方法)
  • 没写构造方法:调用无参构造方法,实例化bean;

  • 写一个构造方法:就使用这个构造方法(这一个无论有参无参)实例化bean

  • 多个构造方法:就调用 无参构造方法 实例化bean,如果没有无参构造方法就会报错。除非某个构造方法上加了@Autowired,就会用这个 构造方法。

3、普通对象

上面那一步推断调用了构造方法后,就会创建一个普通对象(相当于new的一个)。

4、依赖注入(属性赋值)

找到那个添加了@Autowired的属性,然后给属性赋值。那怎么去找,先通过类型查找,查找到多个bean的话,再通过beanName在 Spring存储注册好的Map<beanName,bean对象>中查找。

5、Aware回调

Spring会判断该对象是否实现了BeanNameAware接口、 BeanClassLoaderAware接口、BeanFactoryAware接口,如果实现了,就表示当前 对象必须实现该接口中所定义的setBeanName()、setBeanClassLoader()、 setBeanFactory()方法,那Spring就会调用这些方法并传入相应的参数(Aware回 调)

6、初始化前 (@PostConstruct)

Spring会判断该对象中是否存在某个方法被@PostConstruct注解了,如果存在,Spring会调用当前对象的此方法(初始化前

7、初始化 (InitializingBean)

紧接着,Spring会判断该对象是否实现了InitializingBean接口,如果实现了,就表示当前对象必须实现该接口中的afterPropertiesSet()方法,那Spring就会调用当前对象中的afterPropertiesSet()方法(初始化

8、初始化后 (AOP)
流程:

1、找出所有的切面Bean(@Aspect)

2、遍历这些切面Bean

3、遍历每个切面Bean的方法

4、查找哪些方法适配当前要创建Bean的类(当前创建的Bean为UserService,查找的就是切面UserService的方法的切面类的方法),将这些方法缓存到map里面(Map<UserService.class,method>)。

将缓存方法的map中的访求拿出来,在代理类中执行,下面的target是被代理对象。

9、代理对象

如果使用了AOP就用 代理对象做为Bean

10、Bean

没有使用AOP应用 普通对象做为Bean

Spring事务

当我们在某个方法上加了@Transactional注解后,就表示该方法在调用时会开启Spring事 务,而这个方法所在的类所对应的Bean对象会是该类的代理对象。

Spring事务的代理对象执行某个方法时的步骤:

  1. 判断当前执行的方法是否存在@Transactional注解

  2. 如果存在,则利用事务管理器(TransactionMananger)新建一个数据库连接

  3. 修改数据库连接的autocommit为false

  4. 执行target.test(),执行程序员所写的业务逻辑代码,也就是执行sql

  5. 执行完了之后如果没有出现异常,则提交,否则回滚 Spring事务是否会失效的判断标准:某个加了@Transactional注解的方法被调用时,要判 断到底是不是直接被代理对象调用的,如果是则事务会生效,如果不是则失效

小细节:

为什么会普通对象的bean执行事务方法不生效?

扩展:@Transtaional和AOP一样都是创建代理对象的,所以用了@Transtaional,最后创建的Bean也会是代理对象,所以一个bean不是代理对象,调用@Transcational的方法,事务不会生效。

因为@Transactional,所以会创建一个代理对象,上面有事务的代理对象执行方法的步骤,其中代理对象的方法中 事务管理器创建一个连接应该是为了autocommit设置为false的,只有@Transactional实例出的代理对象bean才可以利用事务理器创建一个数据库连接,然后将autocommit设置为false,不设置成false就自动提交了。

而普通对象的bean只会执行业务,不会有上面的操作。

所以必须得是@Transactional实例化出的代理对象的bean。

当需要用到bean时:

spring首先是通过类型来查找Bean的,如果是多个,那么就会通过名字来查找bean(Spring使用了 Map<beanName,bean对象>的数据结构来存储已经注册的Bean ),如果是一个,那么就不需要通过名字查找了。

上面那个名字beanName,比如:

@Component
public class OrderService{ //beanName为orderService
​
}

如果两个bean的 类型 和 beanName 都相同:

  • 如果允许覆盖:就是@Bean产生的bean会覆盖@Component

  • 如果不允许覆盖:就会报错

小扩展——声明bean的注解:

  • @Component:@Component 是一个通用的注解,用于将一个类标识为 Spring 管理的组件(Bean)。它可以应用于任何类,包括普通的 POJO 类、服务类、数据访问类等。

  • @Service:@Service 注解用于将一个类标识为服务层组件,通常用于表示业务逻辑的实现类。

  • @Repository:@Repository 注解用于将一个类标识为数据访问层组件,通常用于表示数据访问对象(DAO)。

  • @Controller:@Controller 注解用于将一个类标识为控制器组件,通常用于处理用户请求和控制应用程序的流程。

  • @Configuration:@Configuration 注解用于将一个类标识为配置类,该类通常包含了用 @Bean 注解声明的方法,用于配置和创建 Bean。

@Aspect不结合@Component会怎么样?

简称切面Bean,无法将切面类注册到Spring容器中,从而无法使用切面功能。

标签:构造方法,对象,Spring,bean,代理,Bean
From: https://blog.csdn.net/weixin_68742131/article/details/136817216

相关文章

  • 基于springboot实现房屋租赁系统项目演示【附项目源码+论文说明】
    基于springboot实现房屋租赁系统演示摘要社会的发展和科学技术的进步,互联网技术越来越受欢迎。网络计算机的生活方式逐渐受到广大人民群众的喜爱,也逐渐进入了每个用户的使用。互联网具有便利性,速度快,效率高,成本低等优点。因此,构建符合自己要求的操作系统是非常有意义的......
  • 基于springboot实现月度员工绩效考核管理系统项目演示【附项目源码+论文说明】
    基于springboot实现月度员工绩效考核管理系统演示摘要科学时代的发展改变了人类的生活,促使网络与计算机技术深入人类的各个角落,得以普及到人类的具体生活中,为人类的时代文明掀开新的篇章。本系统为月度员工绩效考核管理系统,是专为企业开发的对员工考核的协助软件。可以帮......
  • Springboot+Redis:实现缓存 减少对数据库的压力
    ......
  • 非Spring项目实现RabbitMq消息生产和消费
    问题:​ 如果脱离了Spring要怎么实现一个RabbitMq生产者和消费者的客户端?方案资源依赖<dependencies><!--核心依赖--> <dependency><groupId>com.rabbitmq</groupId><artifactId>amqp-client</artifactId><v......
  • 面试官:SpringBoot如何优雅停机?
    优雅停机(GracefulShutdown)是指在服务器需要关闭或重启时,能够先处理完当前正在进行的请求,然后再停止服务的操作。优雅停机的实现步骤主要分为以下几步:停止接收新的请求:首先,系统会停止接受新的请求,这样就不会有新的任务被添加到任务队列中。处理当前请求:系统会继续处理当前已......
  • 基于springboot的在线教育系统的设计与实现
    基于springboot的在线教育系统的设计与实现文章目录基于springboot的在线教育系统的设计与实现引言功能演示视频开发环境系统功能介绍功能对照表功能截图编程框架SpringBoot框架SSM框架vue框架示例代码数据库操作示例源码获取引言博主介绍:✌专注于Java技术......
  • 基于springboot的古典舞在线交流平台的设计与实现
    基于springboot的古典舞在线交流平台的设计与实现文章目录基于springboot的古典舞在线交流平台的设计与实现引言功能演示视频开发环境系统功能介绍功能对照表功能截图编程框架SpringBoot框架SSM框架vue框架示例代码数据库操作示例源码获取引言博主介绍:✌专......
  • dea设置自动编译spring boot代码,idea代码修改后无须重启服务立即生效
    解决办法1:spring-boot-devtools<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><......
  • 鸿鹄电子招投标系统源码实现与立项流程:基于Spring Boot、Mybatis、Redis和Layui的企业
    随着企业的快速发展,招采管理逐渐成为企业运营中的重要环节。为了满足公司对内部招采管理提升的要求,建立一个公平、公开、公正的采购环境至关重要。在这个背景下,我们开发了一款电子招标采购软件,以最大限度地控制采购成本,提高招投标工作的公开性和透明性,并确保符合国家电子招投标......
  • java springboot 指定运行端口
    javaspringboot指定运行端口 方法1:修改源代码里的“\src\main\resources\application.properties”文件,增加或修改server.port=8081 方法2:如果是已经打包好的jar包,在运行时指定端口。可以将 “\src\main\resources\application.properties” 文件复制到jar包同......