bean对象的手动获取和作用域以及第三方bean的声明

文章介绍了如何在Spring中获取bean,包括通过@Autowired注解获取容器对象,以及使用appContext.getBean()方法按名称、类型或名称和类型获取。讨论了bean的作用域,如单例(singleton)、原型(prototype)等,并解释了@Scope注解和@Lazy延迟初始化。此外,文章还讲解了如何使用@Configuration和@Bean注解来管理第三方库的bean,提供了两种不同的配置方法。

一、bean的获取

1、获得IOC容器对象
@Autowired
private ApplicationContext appContext;
2、根据IOC对象提供的方法获取//返回值为Object类型,需要强转
  • 根据bean的名称获取(名称默认为首字母小写的类名)
appContext.getBean("bean名");
  • 根据bean的类型获取(类名.class)
appContext.getBean(类名.class);
  • 根据bean的名称以及类型获取
appContext.getBean("bean名",类名.class);

二、bean的作用域

默认情况下, Spring项目启动时,会把bean都自动创建好放在IOC容器中,
但会受到作用域以及延迟初始化影响,这里主要针对的是默认单例非延迟加载的bean而言,实际开发中绝大多数bean都是单例的,不需要配置作用域

作用域说明
singleton容器内同 名称 的bean只有一个实例(单例)(默认)
prototype每次使用该 bean 时会创建新的实例(非单例)
request每个请求范围内会创建新的实例(web环境中,了解)
session每个会话范围内会创建新的实例(web环境中,了解
application每个应用范围内会创建新的实例(web环境中,了解)
配置作用域

@Scope("作用域")

延迟初始化

将创建bean这步操作由项目启动时,延迟到第一次使用时创建

@Lazy


三、第三方bean

在使用dom4j等第三方框架时,只能每次都需要创建新的对象,也无法使用@Component等注解来创建bean交给IOC容器管理,为此可以就需要使用 @Bean注解来声明bean.

使用方法一(建议):

定义一个配置类,对声明第三方bean集中管理配置

一、通过@Configuration注解声明一个配置类


二、定义返回值为目标类的方法,return该类对象。在该方法上使用注解@Bean

代码示例如下:

@Configuration
public class CommonConfig {
//将当前方法的返回值对象交给IOC容器管理,成为IOC容器bean
    @Bean
    public SAXReader saxReader(){
        return new SAXReader();
    }
    @Bean
    public JSONObject jsonObject(){
        return new JSONObject();
    }
 }

使用方法二(不建议):

在启动类定义一个返回值为目标类的方法,return一个new 对象。在该方法上使用注解@Bean,代码示例:

@SpringBootApplication
@ServletComponentScan
public class TliasApplication {
    public static void main(String[] args) {
        SpringApplication.run(TliasApplication.class, args);

    }
    //使用@Bean声明dom4j框架的一个工具类的bean对象
    @Bean
    public SAXReader saxReader(){
        return new SAXReader();
    }
     @Bean
    public JSONObject jsonObject(){
        return new JSONObject();
    }
}

可以使用@Bean提供的name/value属性来指定bean名,一般不指定,默认是启动类中的对应方法名

如果第三方bean依赖其他bean对象,也只需直接在bean的定义方法中设置形参列表传入要注入的bean的类型,容器会根据类型自动装配
示例:

   @Bean
    public SAXReader saxReader(DeptService deptService){
        return new SAXReader();
    }
    @Bean
    public JSONObject jsonObject(EmpService empService){
        return new JSONObject();
    }
Spring框架中,**Bean**是一个由IoC(控制反转)容器管理创建的对象。它是Spring应用程序的核心组成部分之一,用于封装业务逻辑、提供服务或存储数据等功能。下面详细介绍Bean的主要作用及意义: --- ### **1. 管理对象的生命周期** Spring容器负责Bean的实例化、配置、装配销毁过程。开发者无需手动编写复杂的新建或销毁逻辑,而是交给容器统一处理。 #### 示例: ```java @Component // 标记为Spring组件 public class UserService { public void performService() { System.out.println("执行服务..."); } } ``` 通过`@Component`标注该类成为Spring容器中的一个Bean,自动被管理。 --- ### **2. 实现松耦合设计** 借助依赖注入(DI),Bean之间的关系不再直接硬编码,而是通过配置文件或注解动态构建关联关系,降低了模块间的耦合度。 例如,在某个Controller中引入UserService作为属性成员变量即可完成绑定操作而不需要new关键字去构造。 ```java @RestController public class UserController { @Autowired // 自动装配所需的服务层对象 private UserService userService; @GetMapping("/test") public String test(){ return this.userService.performService(); } } ``` 这里@Autowired实现了将userService这个service层bean注入进controller里面来调用它的功能,体现了spring ioc的思想即减少程序内部各个部分之间相互引用的情况发生,让系统变得更加清晰易懂易于维护。 --- ### **3. 提供多种作用域选项** 如前面所提过的singleton(单例), prototype (原型) , request/session/application/websocket等不同类型决定了每一个http请求或者session期间能获取几个相同的instance副本. 这允许根据实际需求调整bean的存在形式及时长长短等等特性。 --- ### **4. 支持AOP与事务管理** 利用切面技术(AOP),可以在不影响原有代码的基础上添加额外的行为;同时还能便捷地实施声明式事务机制。 假设我们要给上述UserSerivce加上事务支持的话就很简单啦~ 只需加一行@Transactional注释便行了哟! ```java @Service @Transactional public class UserServiceImpl implements UserService{ ... } ``` 如此一来凡是涉及到数据库修改的操作都将处于事务保护之下咯! --- ### **5. 集成第三方服务** 很多流行的开源项目都可以很方便地整合到基于Spring的应用当中。只要按照官方指导正确设置好相应的starter包之后就能快速启用那些强大的特性啦! 比如说我们可以很容易就把mybatis,jpa,redis,mongodb等各种orm/nosql解决方案融入进来呢~ --- 以上就是关于“bean”的基本介绍啦! 它确实是现代JAVA企业级开发不可或缺的一部分哦~
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值