@Bean放在方法上的作用

本文详细解析了Spring框架中Bean的概念及其作用,介绍了如何通过@Bean注解声明Bean,并结合实例阐述了@Bean与其他配置注解的配合使用。

Spring中Bean的理解以及@Bean的作用

原创 2017年09月04日 16:20:56

Bean在Spring和SpringMVC中无所不在,将这个概念内化很重要,下面分享一下我的想法:

 

一、Bean是啥

1、Java面向对象,对象有方法和属性,那么就需要对象实例来调用方法和属性(即实例化);

 

2、凡是有方法或属性的类都需要实例化,这样才能具象化去使用这些方法和属性;

 

3、规律:凡是子类及带有方法或属性的类都要加上注册Bean到Spring IoC的注解

 

4、把Bean理解为类的代理或代言人(实际上确实是通过反射、代理来实现的),这样它就能代表类拥有该拥有的东西了

 

5、我们都在微博上@过某某,对方会优先看到这条信息,并给你反馈,那么在Spring中,你标识一个@符号,那么Spring就会来看看,并且从这里拿到一个Bean或者给出一个Bean

二、注解分为两类:

1、一类是使用Bean,即是把已经在xml文件中配置好的Bean拿来用,完成属性、方法的组装;比如@Autowired , @Resource,可以通过byTYPE(@Autowired)、byNAME(@Resource)的方式获取Bean;

 

2、一类是注册Bean,@Component , @Repository , @ Controller , @Service , @Configration这些注解都是把你要实例化的对象转化成一个Bean,放在IoC容器中,等你要用的时候,它会和上面的@Autowired , @Resource配合到一起,把对象、属性、方法完美组装。

 

三、@Bean是啥?

 

1、原理是什么?先看下源码中的部分内容:

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Indicates that a method produces a bean to be managedby the Spring container.
翻译:指示一个方法产生一个由spring容器管理的bean
 
 <h3>Overview</h3>
 
 <p>The names and semantics of the attributes tothis annotation are intentionally
 similar to those of the {@code <bean/>} elementin the Spring XML schema. For
 example:
 
 <preclass="code">
     @Bean
     publicMyBean myBean() {
         // instantiate and configure MyBean obj
         returnobj;
    }</pre>

  意思是@Bean明确地指示了一种方法,什么方法呢——产生一个bean的方法,并且交给Spring容器管理;从这我们就明白了为啥@Bean是放在方法的注释上了,因为它很明确地告诉被注释的方法,你给我产生一个Bean,然后交给Spring容器,剩下的你就别管了

 2、记住,@Bean就放在方法上,就是产生一个Bean,那你是不是又糊涂了,因为已经在你定义的类上加了@Configration等注册Bean的注解了,为啥还要用@Bean呢?这个我也不知道,下面我给个例子,一起探讨一下吧:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
package com.edu.fruit;
  //定义一个接口
    publicinterface Fruit<T>{
        //没有方法
}
 
/*
*定义两个子类
*/
package com.edu.fruit;
     @Configuration
     publicclass Apple implementsFruit<Integer>{//将Apple类约束为Integer类型
 
}
 
packagecom.edu.fruit;
     @Configuration
     publicclass GinSeng implementsFruit<String>{//将GinSeng 类约束为String类型
 
}
/*
*业务逻辑类
*/
packagecom.edu.service;
       @Configuration
       publicclass FruitService {
          @Autowired
          privateApple apple;
          @Autowired
          privateGinSeng ginseng;
    //定义一个产生Bean的方法
       @Bean(name="getApple")
       publicFruit<?> getApple(){
       System.out.println(apple.getClass().getName().hashCode);
         System.out.println(ginseng.getClass().getName().hashCode);
       returnnew Apple();
}
}
/*
*测试类
*/
@RunWith(BlockJUnit4ClassRunner.class)
public class Config {
    publicConfig(){
        super("classpath:spring-fruit.xml");
    }
    @Test
    publicvoid test(){
        super.getBean("getApple");//这个Bean从哪来,从上面的@Bean下面的方法中来,返回
                                                          的是一个Apple类实例对象
         
    }
}

从上面的例子也印证了我上面的总结的内容:

1、凡是子类及带属性、方法的类都注册Bean到Spring中,交给它管理;

2、@Bean 用在方法上,告诉Spring容器,你可以从下面这个方法中拿到一个Bean

<think>好的,我现在需要详细分析用户关于Spring框架中@Bean注解方法上的功能和用途的问题。用户已经提供了一些参考资料,我需要结合这些内容,并确保回答符合系统级指令的要求。 首先,我得回顾一下用户提供的引用内容。引用[1]提到@Bean注解用于告诉方法生成一个Bean对象,交给Spring管理,且方法只会被调用一次,之后Bean放在IOC容器中。引用[2]展示了@Bean通常在配置类中使用,配合@Configuration等注解,并且可以指定Bean的名称。 接下来,我需要组织回答的结构,确保清晰分点。可能需要从功能、使用场景、配置类的作用、自定义Bean名称和生命周期控制这几个方面来展开。同时,必须遵循用户的格式要求,比如行内公式用$...$,独立公式用$$...$$,不过这个问题可能不涉及数学公式,但要注意代码块的使用。 用户的问题是关于@Bean注解方法上的具体含义和用法,所以需要详细说明当@Bean用在方法上时,该方法会返回一个对象,这个对象会被Spring管理为Bean。需要提到配置类通常使用@Configuration,这样Spring会通过CGLIB代理增强配置类,处理@Bean方法的调用,确保单例等特性。 另外,要解释name属性可以自定义Bean的名称,如果不指定则默认使用方法名。还要提到@Bean常用于第三方库组件的注册,因为那些类没有用@Component等注解,无法自动扫描。 可能需要提到与其他注解如@Autowired的区别,比如@Bean是显式声明,而@Autowired是注入已有的Bean。此外,可以提及@Bean方法可以使用@Scope注解来控制作用域,比如原型或单例。 需要检查是否有遗漏的信息,比如Bean的生命周期方法,如initMethod和destroyMethod,这些可以在@Bean注解中配置。例如,@Bean(initMethod = "init", destroyMethod = "cleanup")。 还要注意用户提供的示例代码中,配置类使用了@Configuration、@ComponentScan和@Import,这可能需要在解释时提到,说明配置类如何组合其他配置。 最后,生成的相关问题需要考虑用户可能进一步想了解的内容,比如@Bean与@Component的区别、如何管理作用域、配置类的最佳实践、与@Autowired的配合使用,以及如何处理依赖注入等。 现在需要确保回答符合中文要求,结构清晰,分点说明,并正确引用提供的参考资料。同时,添加相关问题,帮助用户深入理解。</think>### @Bean 注解方法上的功能与用途详解 在 Spring 框架中,`@Bean` 注解**用于显式声明一个方法将返回一个对象,并由 Spring IoC 容器管理该对象的生命周期**。以下是其核心功能与用法的分点说明: --- #### 1. **核心功能** - **生成 Bean 实例**:标注 `@Bean` 的方法会被 Spring 调用,**返回的对象会被注册为容器中的 Bean**。例如: ```java @Bean public Student student() { return new Student(); } ``` 该方法生成的 `Student` 对象会被 Spring 管理[^1]。 - **单例控制**:默认情况下,`@Bean` 方法生成的 Bean 是单例的,但可通过 `@Scope` 注解修改作用域(如原型模式)[^2]。 --- #### 2. **使用场景** - **配置类中显式定义**:通常与 `@Configuration` 注解配合使用,表明这是一个配置类,Spring 会通过 CGLIB 代理增强配置类以确保单例行为。例如: ```java @Configuration public class AppConfig { @Bean public DataSource dataSource() { return new HikariDataSource(); } } ``` - **注册第三方库组件**:当需要将**非 Spring 管理的类**(如外部库的类)纳入容器时,`@Bean` 是唯一选择,因为这些类无法通过 `@Component` 自动扫描。 --- #### 3. **自定义 Bean 名称** - **命名规则**:默认以方法名作为 Bean 的名称,但可通过 `name` 属性自定义。例如: ```java @Bean(name = "myStudent") public Student createStudent() { return new Student(); } ``` 此时 Bean 的名称是 `myStudent` 而非方法名 `createStudent`。 --- #### 4. **依赖注入与控制** - **方法参数自动注入**:若 `@Bean` 方法需要其他 Bean 作为依赖,可直接在参数中声明,Spring 会自动注入。例如: ```java @Bean public CourseService courseService(StudentService studentService) { return new CourseService(studentService); } ``` - **生命周期控制**:支持通过 `initMethod` 和 `destroyMethod` 属性指定初始化和销毁方法。例如: ```java @Bean(initMethod = "init", destroyMethod = "cleanup") public ResourcePool resourcePool() { return new ResourcePool(); } ``` --- #### 5. **与其他注解的区别** - **与 `@Component` 的区别**:`@Component` 用于类级别,通过组件扫描自动注册 Bean;`@Bean` 用于方法级别,需显式定义[^1]。 - **与 `@Autowired` 的关系**:`@Autowired` 用于从容器中获取已存在的 Bean,而 `@Bean` 用于向容器添加新 Bean。 --- ###
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值