Spring【五大类注解的存储和读取Bean方法注解】(下)

简介: Spring【五大类注解的存储和读取Bean方法注解】(下)

🍉1.3.3 getBean() 命名


我们会在前面的存储和获取对象时发现,为什么在getBean方法获取Bean对象时要将Bean对象的属性名输入为小驼峰型?

ab784bbf15424b14bcb65944158626bc.png


我们在源码就可以看出这三种情况,我就不过多解释了,大家应该都能读懂


8b26b31889364b04a26eb01bd98ea4fe.png

🍎二.方法注解的存储


🍒2.1 方法注解的存储


🍉2.1.1 @Bean注解的使用


我们先创建一个班级类


@Component
public class User {
    private String name;
    private int Id;
    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", Id=" + Id +
                '}';
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getId() {
        return Id;
    }
    public void setId(int id) {
        Id = id;
    }
}

之后在创建一个方法类我们要注意在定义方法Bean时也要定义五大类注解其一因为⽅法注解 @Bean 要配合类注解才能将对象正常的存储到 Spring 容器中才能获取到

@Component
public class UserBean {
    @Bean
    public User user1(){
        User user = new User();
        user.setId(1);
        user.setName("张三");
        return user;
    }
}


public class Test {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
        UserConfiguration configuration = context.getBean("userConfiguration",UserConfiguration.class);
        User user = (User) context.getBean("user1");
        System.out.println(user.toString());
    }
}

c682890ea7dd4c2892e7e5f1678924e5.png


🍉2.1.2 @Bean的的重命名


可以通过设置 name 属性给 Bean 对象进⾏重命名操作,如下图所示:


95c91b7cfdba4e3fa4fb423da6451162.png

这个重命名的 name 其实是⼀个数组,⼀个 bean 可以有多个名字:


@Bean(name = {"u1", "us1"})
public User user1() {
   User user = new User();
   user.setId(1);
   user.setName("Java");
   return user;
}

在Bean name重名的时候时区分大小写的



a97c4a0fb2bf4284873beead187625a3.png

eb499e64dd2a4053a62d9dfa604c30e6.png

我们会发现会找不到bena name抛出错误


38b2392241884e739ab0e431296f5622.png


🍒2.2 方法注解的获取(对象注⼊@Autowired 或 @Resource)


获取 bean 对象也叫做对象装配,是把对象取出来放到某个类中,有时候也叫对象注⼊

对象装配(对象注⼊)的实现⽅法以下 3 种:


  1. 属性注⼊
  2. Setter 注⼊
  3. 构造⽅法注⼊


🍉2.2.1 属性注⼊


属性注⼊是使⽤ @Autowired 实现的,将 Service 类注⼊到 Controller 类中。

Service 类的实现代码如下:


public class Test {
    public static void main(String[] args) {
          UserConterller2 conterller2 = context.getBean(UserConterller2.class);
                  conterller2.sayHi();
    }
}
@Component
public class UserConterller2 {
   //对象注入方式1: 属性注入
   @Autowired
    private UserService userService;
    public void sayHi(){
        userService.sayHi("属性注入");
    }

ed08a0a4fbbb49e7b2e1931618e45861.png

🍉2.2.2 Setter注入


与上同理

1ca644d0916f43279168976928eeb0b7.png


🍉2.2.2 构造方法注入


3f32174b7245454fa302575b8f9351da.png

🍉2.2.3 同⼀类型多个 @Bean 报错


当出现以下多个 Bean,返回同⼀对象类型时程序会报错,如下代码所示:

@Component
public class Users {
   @Bean
   public User user1() {
     User user = new User();
     user.setId(1);
     user.setName("Java");
     return user;
   }
     @Bean
     public User user2() {
     User user = new User();
     user.setId(2);
     user.setName("MySQL");
     return user;
    }
}
@Controller
public class UserController4 {
   // 注⼊
   @Resource
   private User user;
   public User getUser() {
     return user;
   }
}

以上程序的执⾏结果如下:


cf6d73445fe743ef887a5f155d8cc6ad.png

报错的原因是,⾮唯⼀的 Bean 对象


解决同⼀个类型,多个 bean 的解决⽅案有以下两个:

● 使⽤ @Resource(name=“user1”) 定义

● 使⽤ @Qualifier 注解定义名称

同⼀类型多个 Bean 报错处理


🍎三.总结

🍒3.1小结


将对象存储到 Spring 中:

a. 使⽤类注解:@Controller、@Service、@Repository、@Configuration、@Component【它们之间的关系】

b. 使⽤⽅法注解:@Bean【注意事项:必须配合类注解⼀起使⽤】

Bean 的命名规则:⾸字⺟和第⼆个字⺟都⾮⼤写,⾸字⺟⼩写来获取 Bean,如果⾸字⺟和第⼆个字⺟都是⼤写,那么直接使⽤原 Bean 名来获取 Bean。

从 Spring 中获取对象:

a. 属性注⼊

b. Setter 注⼊

c. 构造函数注⼊(推荐)

注⼊的关键字有:

a. @Autowired

b. @Resource

@Autowired 和 @Resource 区别:出身不同; 使⽤时设置参数不同 @Resource ⽀持更多的参数,⽐如 name。

解决同⼀类型多个 Bean 的报错:

a. 使⽤ @Resource(name="")

b. 使⽤ @Qualifier("")


🍒3.2 三种注⼊优缺点分析


●属性注⼊的优点是简洁,使⽤⽅便;缺点是只能⽤于 IoC 容器,如果是⾮ IoC 容器不可⽤,并且只有在使⽤的时候才会出现 NPE(空指针异常)


●构造⽅法注⼊是 Spring 推荐的注⼊⽅式,它的缺点是如果有多个注⼊会显得⽐较臃肿,但出现这种情况你应该考虑⼀下当前类是否符合程序的单⼀职责的设计模式了,它的优点是通⽤性,官方推荐,在使⽤之前⼀定能把保证注⼊的类不为空


●Setter ⽅式是 Spring 前期版本推荐的注⼊⽅式,但通⽤性不如构造⽅法,所有 Spring 现版本已经推荐使⽤构造⽅法注⼊的⽅式来进⾏类注⼊了


🍒3.3 @Autowired 和 @Resource 的区别


●出身不同:@Autowired 来⾃于 Spring,⽽ @Resource 来⾃于 JDK 的注解


●使⽤时设置的参数不同:相⽐于 @Autowired 来说,@Resource ⽀持更多的参数设置,例如name ,type设置,根据名称获取 Bean


●注入方法数不同: @Autowired 可⽤于 Setter 注⼊、构造函数注⼊和属性注⼊,⽽ @Resource 只能⽤于 Setter 注⼊和属性注⼊,不能⽤于构造函数注⼊

相关文章
|
16天前
|
缓存 Java Spring
实战指南:四种调整 Spring Bean 初始化顺序的方案
本文探讨了如何调整 Spring Boot 中 Bean 的初始化顺序,以满足业务需求。文章通过四种方案进行了详细分析: 1. **方案一 (@Order)**:通过 `@Order` 注解设置 Bean 的初始化顺序,但发现 `@PostConstruct` 会影响顺序。 2. **方案二 (SmartInitializingSingleton)**:在所有单例 Bean 初始化后执行额外的初始化工作,但无法精确控制特定 Bean 的顺序。 3. **方案三 (@DependsOn)**:通过 `@DependsOn` 注解指定 Bean 之间的依赖关系,成功实现顺序控制,但耦合性较高。
实战指南:四种调整 Spring Bean 初始化顺序的方案
|
1月前
|
XML Java 数据格式
Spring从入门到入土(bean的一些子标签及注解的使用)
本文详细介绍了Spring框架中Bean的创建和使用,包括使用XML配置文件中的标签和注解来创建和管理Bean,以及如何通过构造器、Setter方法和属性注入来配置Bean。
71 9
Spring从入门到入土(bean的一些子标签及注解的使用)
|
1月前
|
Java 测试技术 Windows
咦!Spring容器里为什么没有我需要的Bean?
【10月更文挑战第11天】项目经理给小菜分配了一个紧急需求,小菜迅速搭建了一个SpringBoot项目并完成了开发。然而,启动测试时发现接口404,原因是控制器包不在默认扫描路径下。通过配置`@ComponentScan`的`basePackages`字段,解决了问题。总结:`@SpringBootApplication`默认只扫描当前包下的组件,需要扫描其他包时需配置`@ComponentScan`。
|
6月前
|
Java API Spring
Spring容器如何使用一个注解来指定一个类型为配置类型
Spring容器如何使用一个注解来指定一个类型为配置类型
53 0
|
1月前
|
XML Java 数据格式
手动开发-简单的Spring基于注解配置的程序--源码解析
手动开发-简单的Spring基于注解配置的程序--源码解析
47 0
|
5月前
|
XML Java 数据格式
Spring5系列学习文章分享---第三篇(AOP概念+原理+动态代理+术语+Aspect+操作案例(注解与配置方式))
Spring5系列学习文章分享---第三篇(AOP概念+原理+动态代理+术语+Aspect+操作案例(注解与配置方式))
52 0
|
5月前
|
Java Spring
spring基于注解配置数据源
spring基于注解配置数据源
|
XML Java 数据格式
spring ioc中的一些常用annotation注解配置
spring ioc中的一些常用annotation注解配置
|
6月前
|
XML Java 数据格式
Spring 管理 Bean-IOC--基于注解配置 bean
Spring 管理 Bean-IOC--基于注解配置 bean
76 0
|
6月前
|
Java 测试技术 Spring
Spring-基于注解的配置[02自动装载bean]
Spring-基于注解的配置[02自动装载bean]
94 0
下一篇
无影云桌面