其他
@Configuration 和 @Component 的区别 ,别再瞎用了
点击“终码一生”,关注,置顶公众号
耗时8个月联合打造 《 2023年Java高薪课程 》,已更新了 102G 视频,累计更新时长 500+ 个小时,需要的小伙伴可以了解下,一次购买,持续更新,无需2次付费。
“注意:上面说的调用,而不是从spring容器中获取! 见最下面的示例 1 及 示例 2
1
@Configuration 注解@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Configuration {
String value() default "";
}
配置类必须以类的形式提供(不能是工厂方法返回的实例),允许通过生成子类在运行时增强(cglib 动态代理)。 配置类不能是final 类(没法动态代理)。 配置注解通常为了通过 @Bean注解生成 Spring 容器管理的类, 配置类必须是非本地的(即不能在方法中声明,不能是 private)。 任何嵌套配置类都必须声明为static。 @Bean方法可能不会反过来创建进一步的配置类(也就是返回的 bean 如果带有 @Configuration,也不会被特殊处理,只会作为普通的 bean)。
2
@Bean 注解方法执行策略@Configuration
public class MyBeanConfig {
@Bean
public Country country(){
return new Country();
}
@Bean
public UserInfo userInfo(){
return new UserInfo(country());
}
}
@Autowired private Country country;
3
@Component 注解@Component
public class MyBeanConfig {
@Bean
public Country country(){
return new Country();
}
@Bean
public UserInfo userInfo(){
return new UserInfo(country());
}
}
@Component
public class MyBeanConfig {
@Autowired
private Country country;
@Bean
public Country country(){
return new Country();
}
@Bean
public UserInfo userInfo(){
return new UserInfo(country);
}
}
package com.xl.test.logtest.utils;
public class Child {
private String name = "the child";
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
package com.xl.test.logtest.utils;
public class Woman {
private String name = "the woman";
private Child child;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Child getChild() {
return child;
}
public void setChild(Child child) {
this.child = child;
}
}
package com.xl.test.logtest.utils;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;
@Configuration
//@Component
public class Human {
@Bean
public Woman getWomanBean() {
Woman woman = new Woman();
woman.setChild(getChildBean()); // 直接调用@Bean注解的方法方法getChildBean()
return woman;
}
@Bean
public Child getChildBean() {
return new Child();
}
}
package com.xl.test.logtest.utils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
@Configuration
public class Man {
@Autowired
public Man(Woman wn, Child child) {
System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
System.out.println(wn.getChild() == child ? "是同一个对象":"不是同一个对象");
}
}
package com.xl.test.logtest.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import com.xl.test.logtest.utils.Child;
import com.xl.test.logtest.utils.Woman;
@RestController
public class LogTestController {
@Autowired
Woman woman ;
@Autowired
Child child;
@GetMapping("/log")
public String log() {
return woman.getChild() == child ? "是同一个对象":"不是同一个对象";
}
}
package com.xl.test.logtest.utils;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;
//@Configuration
@Component
public class Human {
@Bean
public Woman getWomanBean() {
Woman woman = new Woman();
woman.setChild(getChildBean()); // 直接调用@Bean注解的方法方法getChildBean()
return woman;
}
@Bean
public Child getChildBean() {
return new Child();
}
}
【福利】2023 高薪课程,全面来袭(视频+笔记+源码)
【福利】2023 高薪课程,全面来袭(视频+笔记+源码)
往期推荐