SpringSpring 获取Bean对象 -- 对象装配( 属性注入构造方法注入set注入)
Posted Perceus
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringSpring 获取Bean对象 -- 对象装配( 属性注入构造方法注入set注入)相关的知识,希望对你有一定的参考价值。
@TOC
获取 Bean 对象(对象装配)
获取 bean 对象
也叫做对象装配
,是把对象取出来放到某个类中,有时候也叫对象注⼊
。
对象装配
(对象注⼊)的实现⽅法以下 3 种
:
接下来,我们分别来看。
下⾯我们按照实际开发中的模式,将 Service 类注⼊到 Controller 类中
@Autowired 注解
1. 属性注入
创建一个UserService类:
package com.Service;
import com.User.User;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
@Service
public class UserService
public User findById(int id)
User user=new User();
if(id==1)
user.setName("张三");
user.setAge(18);
user.setId(1);
else if(id==2)
user.setName("李四");
user.setAge(18);
user.setId(2);
return user;
创建UserController类:
package com.Controller;
import com.User.User;
import com.Service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;
@Controller
public class UserController
//属性注入
@Autowired
private UserService userService;
public User findById(Integer id)
if(id==null)
return new User();
return userService.findById(id);
创建测试类:
import com.Controller.UserController;
import com.User.User;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class App
public static void main(String[] args)
ApplicationContext context=new ClassPathXmlApplicationContext("a.xml");
UserController userController=(UserController) context.getBean("userController",UserController.class);
User user= userController.findById(2);
System.out.println(user);
输出:
Username=李四, age=18, Id=2
2. Setter 注入
Setter 注⼊和属性的 Setter ⽅法实现类似,只不过在设置 set ⽅法的时候需要加上 @Autowired 注解
如下代码所示:
@Controller
public class UserController
//设置一个字段
private UserService userService;
//为这个字段生成一个set方法,然后加上注解
@Autowired
public void setUserService(UserService userService)
this.userService = userService;
//调用bean对象的方法进行使用
public User findById(Integer id)
return userService.findById(id);
3. 构造方法注入
如下代码所示:
@Controller
public class UserController3
//先生成一个字段
private UserService userService;
//然后生成构造方法,前面加上注解
@Autowired
public UserController3(UserService userService)
this.userService = userService;
注意:
三种注入优缺点分析
1.属性注⼊
2.构造⽅法注⼊
3.Setter 注入
@Resource 注解
在进⾏类注⼊
时,除了可以使⽤ @Autowired 关键字之外,我们还可以使⽤ @Resource 进⾏注⼊
@Resource 来自 JDK,@Autowired 来自 Spring
1.属性注入
如下代码所示:
@Controller
public class UserController
//添加注解在字段上
@Resource
private UserService userService;
public User findUser(Integer id)
return userService.findById(id);
2.Setter 注入
@Controller
public class UserController2
private UserService userService;
//先创建字段,然后添加注释在构造方法上
@Resource
public void setUserService(UserService userService)
this.userService = userService;
public User findUser(Integer id)
return userService.findById(id);
注意!!
@Resource与@Autowired区别:
注入对象名称问题
当我们把一个对象注入到一个类中的时候,@Autowired和@Resource会尝试着去获取这个对象,首先得先找到这个对象。
在查找这个对象的时候,按照两个标准进行查找,一个是对象名称,另一个是对象类型
- 先根据名称进行获取,如果获取不到,就会根据类型进行获取,如果也获取不到,就会抛出异常。
- 如果名称不匹配,但是类型匹配,且类型匹配相同的对象有多个,也会抛出异常,无法确定是哪一个。
同⼀类型多个 @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;
在另⼀个类中获取 User 对象,如下代码如下:
@Controller
public class UserController4
// 注⼊
@Resource
private User user;
public User getUser()
return user;
以上程序的执⾏结果如下:
同⼀类型多个 Bean 报错处理:
解决同⼀个类型,多个 bean 的解决⽅案有以下两个:
① 使⽤ @Resource(name="XXX")
@Controller
class UserController4
// 注⼊ 通过bean的名称注入
@Resource(name = "user1")
private User user;
public User getUser()
return user;
② 使⽤ @Qualifier("")
@Controller
public class UserController5
// 注⼊
@Autowired
@Qualifier(value = "user2")
private User user;
public User getUser()
return user;
以上是关于SpringSpring 获取Bean对象 -- 对象装配( 属性注入构造方法注入set注入)的主要内容,如果未能解决你的问题,请参考以下文章