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 注⼊和属性注⼊,不能⽤于构造函数注⼊

相关文章
|
3天前
|
Java Spring
【Spring】方法注解@Bean,配置类扫描路径
@Bean方法注解,如何在同一个类下面定义多个Bean对象,配置扫描路径
113 73
|
3天前
|
存储 Java Spring
【Spring】获取Bean对象需要哪些注解
@Conntroller,@Service,@Repository,@Component,@Configuration,关于Bean对象的五个常用注解
|
3天前
|
存储 Java 应用服务中间件
【Spring】IoC和DI,控制反转,Bean对象的获取方式
IoC,DI,控制反转容器,Bean的基本常识,类注解@Controller,获取Bean对象的常用三种方式
|
7月前
|
Java API Spring
Spring容器如何使用一个注解来指定一个类型为配置类型
Spring容器如何使用一个注解来指定一个类型为配置类型
62 0
|
2月前
|
XML Java 数据格式
手动开发-简单的Spring基于注解配置的程序--源码解析
手动开发-简单的Spring基于注解配置的程序--源码解析
53 0
|
6月前
|
XML Java 数据格式
Spring5系列学习文章分享---第三篇(AOP概念+原理+动态代理+术语+Aspect+操作案例(注解与配置方式))
Spring5系列学习文章分享---第三篇(AOP概念+原理+动态代理+术语+Aspect+操作案例(注解与配置方式))
62 0
|
6月前
|
Java Spring
spring基于注解配置数据源
spring基于注解配置数据源
|
XML Java 数据格式
spring ioc中的一些常用annotation注解配置
spring ioc中的一些常用annotation注解配置
|
7月前
|
XML Java 数据格式
Spring 管理 Bean-IOC--基于注解配置 bean
Spring 管理 Bean-IOC--基于注解配置 bean
80 0
|
7月前
|
Java 测试技术 Spring
Spring-基于注解的配置[02自动装载bean]
Spring-基于注解的配置[02自动装载bean]
105 0