spring注入你真搞懂了吗?不会一直都是这样错误理解吧?( 三 )

web.xml

spring注入你真搞懂了吗?不会一直都是这样错误理解吧?

文章插图
 
<bean id="goudanBean" class="services.GoudanService"></bean><bean id="gouBean" class="services.GouService"></bean>Test.java
package test;import org.springframework.context.annotation.AnnotationConfigApplicationContext;import org.springframework.context.annotation.ClassPathBeanDefinitionScanner;import org.springframework.context.support.ClassPathXmlApplicationContext;import services.GoudanService;public class Test {public static void main(String[] args) {//AnnotationConfigApplicationContext ac =//new AnnotationConfigApplicationContext(Appconfig.class);ClassPathXmlApplicationContext cc = new ClassPathXmlApplicationContext("web.xml");//System.out.println(cc.getBean(GoudanService.class).getGouService());System.out.println(cc.getBean(GoudanService.class).getGouBean());}}运行Test.java的result
spring注入你真搞懂了吗?不会一直都是这样错误理解吧?

文章插图
 
我们发现byname模型注入,与no方式注入想比不需要了bean里配置property的ref,spring容器会自动根据GouService定义属性名称去找bean的名称,结果找到了id名称为:gouBean的bean,所以也是可以配置成功的 。
byname就是如果属性名称与bean的id名称相同那么可以自动配置,否则配置错误 。
construct方式配置GoudanService.java
package services;public class GoudanService {GouService gouService;GouService gouBean;//构造方法1GoudanService(GouService gouBean){this.gouBean=gouBean;}////构造方法2//GoudanService(GouService gouService){//this.gouService=gouService;//}////构造方法3//GoudanService(GouService gouService,GouService gouBean){//this.gouService=gouService;//this.gouBean=gouBean;//}public GouService getGouBean() {return gouBean;}public GouService getGouService() {return gouService;}//public void setGouBean(GouService gouBean) {//this.gouBean = gouBean;//}//public void setGouService(GouService gouService) {//this.gouService = gouService;//}}web.xml
spring注入你真搞懂了吗?不会一直都是这样错误理解吧?

文章插图
 
<bean id="goudanBean" class="services.GoudanService"></bean><bean id="gouBean" class="services.GouService"></bean>Test.java
package test;import org.springframework.context.annotation.AnnotationConfigApplicationContext;import org.springframework.context.annotation.ClassPathBeanDefinitionScanner;import org.springframework.context.support.ClassPathXmlApplicationContext;import services.GoudanService;public class Test {public static void main(String[] args) {//AnnotationConfigApplicationContext ac =//new AnnotationConfigApplicationContext(Appconfig.class);ClassPathXmlApplicationContext cc = new ClassPathXmlApplicationContext("web.xml");System.out.println(cc.getBean(GoudanService.class).getGouService());System.out.println(cc.getBean(GoudanService.class).getGouBean());}}分别运行构造方法1,2,3三次,注释掉其他两种构造方法
运行Test.java的result
构造方法1
spring注入你真搞懂了吗?不会一直都是这样错误理解吧?

文章插图
 
构造方法2
spring注入你真搞懂了吗?不会一直都是这样错误理解吧?

文章插图
 
构造方法3
spring注入你真搞懂了吗?不会一直都是这样错误理解吧?

文章插图
 
我们发现construct模型注入,它既可以通过name注入也可以通过type注入 。
Annotaton-based configuration(注解注入方式)@Autowired在这里,很多人网上说@Autowired是通过bytype查找,但其实这种说法有些许的不严谨 。
1.自动注入模型是基于xml的bean注入方式 。
2.bytype模型是只要通过类型查找,如果找不到,或者找到两个相同的类型bean就会报错
3.而@Autowired是通过类型去找,找不到还会通过名称去找
@Resource而@Resource是通过byname查找,这种说法和@Autowired相似也是不严谨的 。
byname模型是只要通过名称查找,如果找不到报错而@Resource是通过名称去找,找不到还会通过类型去找,不单单只限于通过name去查找 。
区别
  1. @Autowired type --> name --> error
    spring包中的AutowiredAnnotationBeanPostProcessor.java中的一个方法实现解析的
  2. @Resource name --> type --> error
    javax中的 commonAnnotationBeanPostProcessor.java中的一个方法实现解析的

来源:https://blog.csdn.net/qq_40994080/article/details/108090104?utm_medium=distribute.pc_category.none-task-blog-hot-2.nonecase&depth_1-utm_source=distribute.pc_category.none-task-blog-hot-2.nonecase&request_id=


推荐阅读