spring|Spring 读取和存储对象

目录
1. 存储Bean对象
1.1 添加注解存储Bean对象到spring中
1.2 注解类
1.2.1 @Controller(控制器存储)
1.2.2 @Service(服务存储)
1.2.3 @Repository(仓库储存)
1.2.4 @Component(组件存储)
1.2.5 @Congfiguration(配置存储)
1.3 类注解的作用
1.4 @Bean注解的使用
1.4.1Bean的重命名
2. 获取Bean对象
2.1 属性注入
2.2 构造方法注入
2.3 Setter注入
2.4 三种注入方法的优缺点(MS)
2.5 另外一种注入关键字(@Resource)
2.5.1@Resource属性注入
2.5.2 @Resource构造方法注入
2.5.3 @Resource Setter 方法注入
2.6同?类型多个 @Bean 报错
2.6.1 使用@Resource(name="user1")
2.6.2 使用@Qualifier

1. 存储Bean对象 存储Bean之前,需要在spring-config.xml 中添加bean注册内容
spring|Spring 读取和存储对象
文章图片

1.1 添加注解存储Bean对象到spring中 分为两种注解类型:

注解类:@Controller 、 @Service、@Repository、@Component、@Congfiguration
方法注解:@Bean
1.2 注解类 1.2.1 @Controller(控制器存储)
@Controller public class UserController { public void sayHi(String name) { System.out.println("你好," + name); } }

import com.beans.*; import com.model.User; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; /** * @program: spring-2 * @description: * @author: DRY * @create: 2022-07-03 14:14 **/ public class App { public static void main(String[] args) { 1. 获取spring上下文 ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml"); 2. 得到bean UserController userController = context.getBean(UserController.class); 3. 使用bean userController.sayHi("张三"); } }

1.2.2 @Service(服务存储)
@Service public class UserService { public void sayHi(String name) { System.out.println("你好," + name); } }

class App { public static void main(String[] args) { // 1.得到 spring 上下?ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml"); // 2. 得到bean UserService userService = context.getBean("userService",UserService.class); //3. 使用bean userService.sayHi("张三"); } }

1.2.3 @Repository(仓库储存)
@Repository public class UserRepository { public void sayHi(String name) { System.out.println("你好," + name); } }

public class App { public static void main(String[] args) { // 1. 获取spring上下文 ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml"); UserRepository userRepository = context.getBean("userRepository",UserRepository.class); userRepository.sayHi("张三"); } }

1.2.4 @Component(组件存储)
1.2.5 @Congfiguration(配置存储)
注意:
1. 即使在Spring中配置了bean 的扫描路径,但是5大类的注解不可以省略。
2. 即使加了5大类注解,但类没有放在spring配置的bean路径下,那么也是不能将类注入到spring中。
spring|Spring 读取和存储对象
文章图片

@Controller 、@Service、@Repository、@Configuration 都是依靠@Component实现的。 即@Component使其他四个的父类。
1.3 类注解的作用 每个注解类都有不同的用途,使用不同的注解类,可以清楚地让程序源码明白这个类是在干什么,又什么用途。
spring|Spring 读取和存储对象
文章图片

一般情况下,类注解的bean名称命名规则是小驼峰,将类名第一个字母小写。
Bean命名规则:
如果第一个字母为大写,第二个字母为小写,那么Bean的命名规则就是首字母小写。
如果第一个字母和第二个字母都是大写,那么Bean的命名就是原类名。
@Controller public class USController { public void sayHi(String name) { System.out.println("你好," + name); } }


public class App { public static void main(String[] args) { // 1. 获取spring上下文 ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml"); USController usController = context.getBean("USController",USController.class); usController.sayHi("张三"); } }

1.4 @Bean注解的使用
@Component public class UserBeans { //方法注解@Bean必须配合五大类注解才有效 @Bean //@Bean(name = "getUser")//相当于给对象重命名。用花括号可以方多个别名,重命名之后,就不能用方法名获取Bean,如果没有起别名,就可以用方法名获取Bean //@Bean(name = {"getUser"},{“userNa”}) public User user1(){ User user = new User(); user.setId(1); user.setName("张三"); user.setPassword("123"); return user; } }

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

public class App { public static void main(String[] args) { // 1. 获取spring上下文 ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml"); User user1 = context.getBean("user1", User.class); //第一个参数必须跟UserBeans方法名一样 System.out.println(user1); } }

注意:
方法注解@Bean 必须要配合5大类注解一起使用才有效
spring|Spring 读取和存储对象
文章图片

1.4.1Bean的重命名
第一种:
spring|Spring 读取和存储对象
文章图片

第二种:
spring|Spring 读取和存储对象
文章图片

spring|Spring 读取和存储对象
文章图片

当给@Bean重命名之后,那么就不能使用方法名来获取对象。
当@Bean重命名之后就不能使用方法名(User1)来获取Bean,如果没有对Bean进行重命名,那么可以使用方法名获取Bean。
2. 获取Bean对象 获取bean对象叫做对象装配,即使把对象取出来放到某个类中,也叫对象注入。
对象装配的实现方法有3种:
1. 属性注入
2. 构造方法注入
3. Setter注入
2.1 属性注入 属性注?是使? @Autowired 实现的,将 Service 类注?到 Controller 类中。
@Service public class UserService { public void sayHi(String name) { System.out.println("你好," + name); } /** * 根据id获取用户 * @param id * @return */ public User getUserById(int id) { //伪代码,不用连接数据库 User user = new User(); user.setId(id); user.setName("李四"); user.setPassword("aaaa"); return user; } }

@Controller public class UserController { //1. 属性注入 @Autowired public UserService userService; /** * 根据id获取用户 * @param id * @return */ public User getUserById(int id) { //伪代码 return userService.getUserById(id); } public void sayHi(String name) { System.out.println("你好," + name); } }


public class App { public static void main(String[] args) { // 1. 获取spring上下文 ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml"); UserController userController = context.getBean(UserController.class); System.out.println(userController.getUserById(10)); } }

2.2 构造方法注入
@Controller public class UserController2 { public void sayHi(String name) { System.out.println("你好," + name); }private UserService userService; //2. 构造方法注入 @Autowired//如果当前类只有一个构造方法,那么可以省略,有多个构造方法,不可以省略 public UserController2(UserService userService) { this.userService = userService; }public User getUserById(int id) { //伪代码 return userService.getUserById(id); } }

2.3 Setter注入 Setter 注?和属性的 Setter ?法实现类似,只不过在设置 set ?法的时候需要加上 @Autowired 注解。
@Controller public class UserController3 { public void sayHi(String name) { System.out.println("你好," + name); }private UserService userService; //3. Setter注入 @Autowired public void setUserService3(UserService userService) { this.userService = userService; }public User getUserById(int id) { //伪代码 return userService.getUserById(id); } }

注意:如果当前类只有一个构造方法,那么 @Autowired 可以省略,如果方法中有多个构造方法,@Autowired不可以省略。
2.4 三种注入方法的优缺点(MS)
属性注入:优点是代码简洁,使用方便。缺点是只能用loC容器,如果是非loC容器不可用,并且只有在使用的时候才会出现空指针异常。
构造方法注入:优点是通用性好,在调用对象之前,一定能保证该对象不为空。缺点是如果有多个参数来实现构造方法的初始化,会显得代码比较臃肿,此时就要考虑写的代码是否符合单一职责的设计模式了。(推荐使用)
Setter:通用性不如构造方法。前期Spring推荐的版本。

2.5 另外一种注入关键字(@Resource) 2.5.1@Resource属性注入
@Controller public class UserController4 { //属性注入 @Resource private UserService userService; public User getUserById(int id) { //伪代码 return userService.getUserById(id); } }

public class App { public static void main(String[] args) { // 1. 获取spring上下文 ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml"); UserController4 userController4 = context.getBean(UserController4.class); System.out.println(userController4.getUserById(20)); } }

2.5.2 @Resource构造方法注入
@Controller public class UserController5 {private UserService userService; //构造方法注入 @Resource public UserController5(UserService userService){ this.userService = userService; } public User getUserById(int id) { //伪代码 return userService.getUserById(id); } }

spring|Spring 读取和存储对象
文章图片
可以看到,构造方法注入会报错。
2.5.3 @Resource Setter 方法注入
@Controller public class UserController5 {private UserService userService; //Setter 注入 @Resource public void setUserService(UserService userService) { this.userService = userService; } public User getUserById(int id) { //伪代码 return userService.getUserById(id); } }

@ Autowired 和 @ Resource 区别(MS):

1. 出身不同:@ Autowired来自Spring , @ Resource来自JDK的注解;
2. 使用时设置的参数不同:相?于 @Autowired 注解来说,@Resource 注解?持更多的参数设置,例如 name 设置,根据名称获取 Bean。
3. @ Autowired 可用于属性注入、构造方法注入、Setter注入,而@ Resource关键字不能使用构造方法注解。
spring|Spring 读取和存储对象
文章图片

2.6同?类型多个 @Bean 报错 当一个类型被注册到Spring中多次时,程序运行会出现异常。
@Component public class UserBeans2 {@Bean(name = "user1") public User user1(){ User user = new User(); user.setId(1); user.setName("张三"); user.setPassword("123"); return user; } @Bean(name = "user2") public User user2(){ User user = new User(); user.setId(2); user.setName("王五"); user.setPassword("456"); return user; } }

@Controller public class UserController6 { @Resource private User user; public User getUser() { return user; } }

执行结果:非唯一的Bean对象。
解决同?个类型,多个 bean 的解决?案有以下两个:
使? @Resource(name="user1") 定义。 使? @Qualifier 注解定义名称。
2.6.1 使用@Resource(name="user1")
@Controller public class UserController6 { @Resource(name = "user1") private User user; public User getUser() { return user; } }

2.6.2 使用@Qualifier
@Controller public class UserController7 { @Autowired @Qualifier(value = "https://www.it610.com/article/user2") private User user; public User getUser() { return user; } }

public class App { public static void main(String[] args) { // 1. 获取spring上下文 ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml"); UserController7 userController7 = context.getBean(UserController7.class); System.out.println(userController7.getUser()); } }

练习:
在 Spring 项?中,通过 main ?法获取到 Controller 类,调? Controller ??通过注?的?式调?Service 类,Service 再通过注?的?式获取到 Repository 类,Repository 类??有?个?法构建?个User 对象,返回给 main ?法。Repository ?需连接数据库,使?伪代码即可。
public class User { private int id; private String name; private String password; public int getId() { return id; }public void setId(int id) { this.id = id; }public String getName() { return name; }public void setName(String name) { this.name = name; }public String getPassword() { return password; }public void setPassword(String password) { this.password = password; }@Override public String toString() { return "User{" + "id=" + id + ", name='" + name + '\'' + ", password='" + password + '\'' + '}'; } }

@Repository public class UserRepository2 { public User getUser() { //伪代码 User user = new User(); user.setId(5); user.setName("王朱"); user.setPassword("5555"); return user; } }

@Service public class UserService2 { @Autowired private UserRepository2 repository2; public User getUser() { return repository2.getUser(); } }

@Controller public class UserController8 { @Autowired private UserService2 userService2; public User getUser() { return userService2.getUser(); } }

public class App { public static void main(String[] args) { // 1. 获取spring上下文 ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml"); UserController8 userController8 = context.getBean(UserController8.class); System.out.println(userController8.getUser()); } }

【spring|Spring 读取和存储对象】 输出:User{id=5, name='王朱', password='5555'}

    推荐阅读