随手记录3:spring 中的@Bean和@Service 注解的内容使用;
简介
基于之前的文章
Spring FactoryBean的使用
我们了解到@Bean和@Service注解都能将Bean注入spring容器中
@Bean注解在方法上一般在配置类的中搭配@Configuration/@Component 注解使用,
@Bean 括号里面不指定目标对象的名称则以方法名为主,如果指定了则以括号里面的
@Service 如果默认的使用的是类名,如果指定则是我们括号里面指定的;
还是之前的代码内容;
资源下载地址
1.UserService
带有@service注解内容;
public class UserService {
private String userName="默认小康康";
public UserService() {
System.out.println(this);
System.out.println("UserService初始化");
}
private UserService(String userName) {
this.userName = userName;
}
public static UserService getInstance(String userName){
return new UserService(userName);
}
public String say(String detail) {
System.out.println("用户{"+userName+"} say{"+detail+"}");
return "say执行完毕";
}
}
2.FactoryBeanConfig 配置类;
@Bean都没有指定生成的类的名称;;
@Configuration
public class FactoryBeanConfig {
@Bean
public UserServiceFactoryBean createUserFactoryBean (){
UserServiceFactoryBean bean = new UserServiceFactoryBean("candy");
System.out.println("createUserFactoryBean初始化");
return bean;
}
@Bean
public UserService createUserService (){
UserService bean = new UserService();
System.out.println("createUserService初始化");
return bean;
}
}
3.FactoryController
如果直接通过
@Autowired
private UserService userService;
则根据@Autowired 注解的特性先根据byType来确定,因为spring中同时管理了多个UserService 不同beanName的类,所以 @Autowired 会转化成根据名字来选择;
@Autowired
private UserService userService; 获取到的是基于UserServiceclass类上面的注解注入的bean;
如果使用下面的
@Autowired
private UserService a;
则默认发现多个抛出异常信
这主要是有三个目标类,只是spring管理的对象的名称不一致;我们还可以通过
@Primary 注解选择一个作为主要的.
我们也可以搭配@Qualifier注解使用通过名称来注入;
@Autowired
@Qualifier("userService")
private UserService userService;
@Autowired
@Qualifier("createUserService")
private UserService createUserService;
@Autowired
@Qualifier("createUserFactoryBean")
private UserService createUserFactoryBean;
分别是上面初始化的三个类内容;
@RestController
@RequestMapping("/factory")
public class FactoryController {
@Autowired
private UserServiceFactoryBean factoryBean;
@Autowired
private UserService userService;
@RequestMapping("/test")
public String test() throws Exception{
String say = userService.say("注入的userService成功");
// say = createUserFactoryBean.say("注入的userService成功");
say = factoryBean.getObject().say("注入的userService的factoryBean成功");
return "执行完毕了";
}
}