更简单获取到Bean对象(1)
1)屬性注入(屬性注冊(cè))
比如說我要在UserController里面調(diào)用UserService對(duì)象的方法,我們最早的方法是創(chuàng)建一個(gè)UserService對(duì)象
我們?yōu)榱诉M(jìn)行驗(yàn)證屬性注入的方式,做了以下幾個(gè)工作:
1)先在UserService里面寫了一個(gè)方法,根據(jù)不同的用戶ID向數(shù)據(jù)庫中查詢用戶并返回;
@Service public class UserService{public User run(Integer id) {//前端傳過來的參數(shù)可能是空,根據(jù)用戶ID查詢數(shù)據(jù)庫;if (id == 1) {User user = new User();user.setId(id);user.setName("周韻杠");return user;}else{User user=new User();user.setName("胡子");user.setId(id);return user;}} }2)我們?cè)購腢serController中寫一段代碼,先獲取到UserService對(duì)象,在調(diào)用UserService里面的方法獲取到User對(duì)象
package APP.Controller;import APP.BeanMethod.User; import APP.Service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; //將當(dāng)前的類注冊(cè)到Spring里面 @Controller public class UserController {public void start( String name){System.out.println("當(dāng)前的類已經(jīng)啟動(dòng),我是被Contraller注解修飾的"+name);} //1.屬性注入,屬性注冊(cè),從Spring里面進(jìn)行獲取一個(gè)對(duì)象,并注冊(cè)到當(dāng)前類,在屬性上加上注解@Autowiredprivate UserService userService;public User findUser(Integer id){if(id==null){return null;}User user=userService.run(id);return user;} }3)我們?cè)趍ain方法里面先獲取到UserController對(duì)象,在調(diào)用里面的方法,通過層層調(diào)用,獲取到UserController對(duì)象
?//1.先進(jìn)行獲取Spring的上下文對(duì)象ApplicationContext context=new ClassPathXmlApplicationContext("web.xml");//2.得到Controller對(duì)象UserController userController=context.getBean("userController",UserController.class);//調(diào)用findUser方法進(jìn)行查詢用戶,實(shí)際上的查詢是在UserService里面進(jìn)行查詢的User user=userController.findUser(1);System.out.println(user); /我們寫這個(gè)方法是為了進(jìn)行驗(yàn)證,咱們的UserService類是否成功的注入到了UserController里面2)Setter注入
//1將UserService注冊(cè)到當(dāng)前類里面(使用Setter注入的方式),首先先進(jìn)行創(chuàng)建一個(gè)屬性,定義一個(gè)屬性 private UserService userService; //2.給這個(gè)屬性設(shè)置一個(gè)Setter方法,并給Setter方法加上一個(gè)@Autowired的注解 @Autowired//如果說缺少了這個(gè)注解就會(huì)發(fā)生空指針異常 public void setUserService(UserService userService) {this.userService = userService; } //3新創(chuàng)建一個(gè)方法,在方法里面調(diào)用UserService的查詢方法,并返回用戶對(duì)象public User FindUser(Integer id) { if(id==null) {return null; }else{User user= userService.run(id);return user;} }再Setter注入里面需要進(jìn)行注意:在Setter方法上面是不可以省略@Autowried,否則就會(huì)注入失敗
3)通過構(gòu)造方法來進(jìn)行注入?
//1.使用構(gòu)造方法來進(jìn)行注入對(duì)象,并先進(jìn)行創(chuàng)建一個(gè)要注入的對(duì)象private UserService userService; //2創(chuàng)建構(gòu)造方法,給構(gòu)造方法上面添加@Autowired注解@Autowiredpublic UserController(UserService userService) {this.userService = userService;} //3調(diào)用Service方法來返回User對(duì)象 public User FindUser(Integer id) {if(id==null) {return null;} else{User user= userService.run(id);return user;} }1)先寫上一個(gè)UserService屬性
2)生成UserService的構(gòu)造方法,并在上面加上@Autowired方法
上面我們都是通過@Autowired這個(gè)注解來實(shí)現(xiàn)注入的,下面我們類似使用@resource來實(shí)現(xiàn)對(duì)象的注入,它的用法是和@Autowired的用法是相同的;
1)這樣寫也是可以的,通過屬性注入的方式是可以取出對(duì)象的 @Controller public class UserController4 {@Resourceprivate UserService userService;public User Start(Integer ID){if(ID==null||ID.equals("")){return null;}else{User user= userService.run(1);return user;}} 2)我們也是可以通過Setter的方式來進(jìn)行構(gòu)建的ApplicationContext context=new ClassPathXmlApplicationContext("web.xml");UserController4 userController4=context.getBean("userController4",UserController4.class);User user=userController4.FindById(2);System.out.println(user);@Controller public class UserController4{@Resourceprivate UserService userService;public UserController4(UserService userService) {this.userService = userService;}public User FindById(Integer id){if(id==null||id.equals("")){return null;}else{User user= userService.run(id);return user;}} }@Autowired和@Resource有什么區(qū)別?注入的方法?都可以實(shí)現(xiàn)將一個(gè)對(duì)象注入到當(dāng)前類里面
他們?cè)赟pringBoot里面都是將依賴對(duì)象注入到當(dāng)前對(duì)象的功能
1)@Resource是來源于JDK,但是@Autowired是來源于Spring框架提供的;
2)針對(duì)用法來說:我們通過不斷的測(cè)試可以得知,我們使用@resource注解的方式只能通過屬性注入和Setter注入的方式來進(jìn)行獲取對(duì)象,但是如果使用構(gòu)造器的方式就會(huì)發(fā)生報(bào)錯(cuò),但是@Autowired可以進(jìn)行屬性注入,Setter注入,構(gòu)造器注入;
3)功能不同,@Resource本身可以配置更多的屬性進(jìn)行使用可以設(shè)置7個(gè)屬性,可以同時(shí)設(shè)定name和type參數(shù),但是@Autowired支持的屬性比較只支持required()設(shè)置,但是他可以配合? @Qualifier(value = "u1")來進(jìn)行使用
@Autowired(request=“true”)
當(dāng)@Autowired沒有顯示聲明時(shí)默認(rèn)為true
這個(gè)時(shí)候注入,該bean必須存在,否則就會(huì)注入失敗
比如說@Resource可以配合name屬性和type來進(jìn)行使用,從而完成對(duì)象的別名注入
context.getBean(UserController.class);
context.getBean("userController");
context.getBean("userController",UserController.class)
如果注入的名稱是不存在的,并且類型有多個(gè)那么注入就會(huì)失敗
4)Autowired是先根據(jù)類型進(jìn)行查找,如果存在多個(gè)Bean就按照名字來進(jìn)行查找
Resource是先根據(jù)名稱進(jìn)行查找,如果名稱查詢不到,那么就根據(jù)類型進(jìn)行查找
@Component public class GetBean {@Bean(name="u1")//將當(dāng)前User對(duì)象存儲(chǔ)到Spring里面public User GetUser1(){User user=new User();user.setId(1);user.setName("李佳偉");return user;}@Bean(name="u2")public User GetUser2(){User user=new User();user.setName("張某某");user.setId(2);return user;} }@Controller public class Controller1 {@Autowiredprivate User user;public User getUser(){return user;} }ApplicationContext context=new ClassPathXmlApplicationContext("web.xml");Controller1 userController=context.getBean("controller1", Controller1.class);User user= userController.getUser();System.out.println(user);上面的這種寫法是錯(cuò)誤的,因?yàn)槲覀冊(cè)谑褂脤傩宰⑷氲臅r(shí)候?qū)懥艘痪浯aprivate User user(上面寫了一個(gè)注解)----我們的注解會(huì)先拿著user名字到User那邊的對(duì)象去找(本質(zhì)上是去找名字屬性,看看是不是和u1,u2是相等的,沒有一個(gè)Bean名字叫做user,顯然是不相等的,名字都不相等了)
然后再根據(jù)class對(duì)象找,這個(gè)對(duì)象還具有多個(gè),那么就會(huì)發(fā)生報(bào)錯(cuò))
5)編譯器提示不同,當(dāng)注入 Mapper 對(duì)象時(shí),使用 @Autowired 注解編譯器會(huì)提示錯(cuò)誤,而使用 @Resource 注解則不會(huì)提示錯(cuò)誤。
下面這幾種寫法是對(duì)的:
package APP.BeanMethod;import org.springframework.context.annotation.Bean; import org.springframework.stereotype.Component;@Component public class GetBean {@Bean//將當(dāng)前User對(duì)象存儲(chǔ)到Spring里面public User GetUser1(){User user=new User();user.setId(1);user.setName("李佳偉");return user;}@Beanpublic User GetUser2(){User user=new User();user.setName("張某某");user.setId(2);return user;} }@Controller public class Controller1 {@Autowiredprivate User GetUser1;//這里面的變量名必須和上面的方法名是相同的public User getUser(){return GetUser1;} } 下面的main方法代碼是不變的 @Controller public class Controller1 {@Autowiredprivate User u2;public User getUser(){return u2;} }@Component public class GetBean {@Bean(name ="u1")//將當(dāng)前User對(duì)象存儲(chǔ)到Spring里面public User GetUser1(){User user=new User();user.setId(1);user.setName("李佳偉");return user;}@Bean(name="u2")public User GetUser2(){User user=new User();user.setName("張某某");user.setId(2);return user;} }總結(jié):private修飾的對(duì)象名要么方法名字是相同的,要么和@bean中的name屬性有一個(gè)相同
除了這兩種方法之外還有兩種解決方案:
解決相同類型的多個(gè)Bean的報(bào)錯(cuò)
1)@Resource(name = "使用@Bean修飾的方法名或者是@Bean中的name屬性")
@Component public class GetBean {@Bean(name ="u1")//將當(dāng)前User對(duì)象存儲(chǔ)到Spring里面public User GetUser1(){User user=new User();user.setId(1);user.setName("李佳偉");return user;}@Bean(name="u2")public User GetUser2(){User user=new User();user.setName("張某某");user.setId(2);return user;} }@Controller public class Controller1 {@Resource(name ="u1")private User user;//這里面的user變量名既不和方法名相同,還不等于被@Bean修飾方法中的name屬性public User getUser(){return user;} }2)使用注入注解@Autowried加上@Qualifier來進(jìn)行搭配使用
@Component public class GetBean {@Bean(name ="u1")//將當(dāng)前User對(duì)象存儲(chǔ)到Spring里面public User GetUser1(){User user=new User();user.setId(1);user.setName("李佳偉");return user;}@Bean(name="u2")public User GetUser2(){User user=new User();user.setName("張某某");user.setId(2);return user;} }@Controller public class Controller1 {@Autowired@Qualifier(value = "u1")private User user;public User getUser(){return user;} }3)使用上下文對(duì)象進(jìn)行獲取的時(shí)候,ID直接變成@Bean中的name屬性
總結(jié)
以上是生活随笔為你收集整理的更简单获取到Bean对象(1)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 套接字和网络
- 下一篇: ffmpeg压缩视频