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

相关文章
|
1天前
|
Java 数据库连接 数据库
Springboot整合mybatis注解版(202005)
Springboot整合mybatis注解版(202005)
11 3
|
1天前
|
运维 Java 关系型数据库
Spring运维之boot项目bean属性的绑定读取与校验
Spring运维之boot项目bean属性的绑定读取与校验
10 2
|
1天前
|
SQL Java 数据库连接
2万字实操案例之在Springboot框架下基于注解用Mybatis开发实现基础操作MySQL之预编译SQL主键返回增删改查
2万字实操案例之在Springboot框架下基于注解用Mybatis开发实现基础操作MySQL之预编译SQL主键返回增删改查
8 2
|
1天前
|
Java
springboot自定义log注解支持EL表达式
springboot自定义log注解支持EL表达式
6 0
|
1天前
|
缓存 Java 编译器
1.SpringBoot01-自定义注解
1.SpringBoot01-自定义注解
8 0
|
1天前
|
Java Spring
spring基于注解配置数据源
spring基于注解配置数据源
8 0
|
4天前
|
Java Maven Spring
Spring中AOP最简单实例-@注解形式
Spring中AOP最简单实例-@注解形式
15 0
|
1天前
|
Java
springboot自定义拦截器,校验token
springboot自定义拦截器,校验token
12 6
|
1天前
|
Java 关系型数据库 MySQL
Mybatis入门之在基于Springboot的框架下拿到MySQL中数据
Mybatis入门之在基于Springboot的框架下拿到MySQL中数据
10 4
|
1天前
|
存储 运维 Java
Spring运维之boot项目开发关键之日志操作以及用文件记录日志
Spring运维之boot项目开发关键之日志操作以及用文件记录日志
13 2