概括为:先按类型找,然后按名称找
案例1:@Autowired标注在构造器上,通过构造器注入依赖对象
Service1
package com.javacode2018.lesson001.demo26.test0;
import org.springframework.stereotype.Component;
@Component
public class Service1 {
}
Service2
package com.javacode2018.lesson001.demo26.test0;
import org.springframework.stereotype.Component;
@Component
public class Service2 {
private Service1 service1;
public Service2() { //@1
System.out.println(this.getClass() + “无参构造器”);
}
public Service2(Service1 service1) { //@2
System.out.println(this.getClass() + “有参构造器”);
this.service1 = service1;
}
@Override
public String toString() { //@2
return “Service2{” +
“service1=” + service1 +
‘}’;
}
}
Service2中依赖于Service1,有2个构造方法
@1:无参构造器
@2:有参构造器,可以通过这个传入依赖的Service1
@3:重写了toString方法,一会打印测试的时候方便查看
来个总的配置文件
package com.javacode2018.lesson001.demo26.test0;
import org.springframework.context.annotation.ComponentScan;
@ComponentScan //@1
public class MainConfig0 {
}
@1:会自动扫描当前类所在的包,会将Service1和Service2注册到容器。
来个测试用例
package com.javacode2018.lesson001.demo26;
import com.javacode2018.lesson001.demo26.test0.MainConfig0;
import org.junit.Test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class InjectTest {
@Test
public void test0() {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MainConfig0.class);
for (String beanName : context.getBeanDefinitionNames()) {
System.out.println(String.format(“%s->%s”, beanName, context.getBean(beanName)));
}
}
}
main方法中启动容器,加载MainConfig0配置类,然后输出容器中所有的bean
运行部分输出
class com.javacode2018.lesson001.demo26.test0.Service2无参构造器
service1->com.javacode2018.lesson001.demo26.test0.Service1@4a94ee4
service2->Service2{service1=null}
输出中可以看出调用了Service2的无参构造器,service2中的service1为null
通过@Autowired指定注入的构造器
在Service2有参有参构造器上面加上@Autowired注解,如下:
@Autowired
public Service2(Service1 service1) {
System.out.println(this.getClass() + “有参构造器”);
this.service1 = service1;
}
再次运行test0()
class com.javacode2018.lesson001.demo26.test0.Service2有参构造器
service1->com.javacode2018.lesson001.demo26.test0.Service1@4ec4f3a0
service2->Service2{service1=com.javacode2018.lesson001.demo26.test0.Service1@4ec4f3a0}
Service2有参构造器被调用了,service2中的service1有值了。
案例2:@Autowired标注在方法上,通过方法注入依赖的对象
Service1
package com.javacode2018.lesson001.demo26.test1;
import org.springframework.stereotype.Component;
@Component
public class Service1 {
}
Service2
package com.javacode2018.lesson001.demo26.test1;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class Service2 {
private Service1 service1;
@Autowired
public void injectService1(Service1 service1) { //@1
System.out.println(this.getClass().getName() + “.injectService1()”);
this.service1 = service1;
}
@Override
public String toString() {
return “Service2{” +
“service1=” + service1 +
‘}’;
}
}
@1:方法上标注了@Autowired,spring容器会调用这个方法,从容器中查找Service1类型的bean,然后注入。
来个总的配置文件
package com.javacode2018.lesson001.demo26.test1;
import org.springframework.context.annotation.ComponentScan;
@ComponentScan
public class MainConfig1 {
}
来个测试用例
InjectTest中加个方法
@Test
public void test1() {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MainConfig1.class);
for (String beanName : context.getBeanDefinitionNames()) {
System.out.println(String.format(“%s->%s”, beanName, context.getBean(beanName)));
}
}
运行输出
com.javacode2018.lesson001.demo26.test1.Service2.injectService1()
service1->com.javacode2018.lesson001.demo26.test1.Service1@9597028
service2->Service2{service1=com.javacode2018.lesson001.demo26.test1.Service1@9597028}
通过injectService1方法成功注入service1
案例3:@Autowired标注在setter方法上,通过setter方法注入
上面2种通过构造器,和通过普通的一个方法注入,不是很常见,可以将@Autowired标注在set方法上面,来注入指定的对象
Service1
package com.javacode2018.lesson001.demo26.test2;
import org.springframework.stereotype.Component;
@Component
public class Service1 {
}
Service2
package com.javacode2018.lesson001.demo26.test2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class Service2 {
private Service1 service1;
@Autowired
public void setService1(Service1 service1) { //@1
System.out.println(this.getClass().getName() + “.setService1方法”);
this.service1 = service1;
}
@Override
public String toString() {
return “Service2{” +
“service1=” + service1 +
‘}’;
}
}
@1:标准的set方法,方法上使用了 @Autowired,会通过这个方法注入Service1类型的bean对象。
来个总的配置文件
package com.javacode2018.lesson001.demo26.test2;
import org.springframework.context.annotation.ComponentScan;
@ComponentScan
public class MainConfig2 {
}
来个测试用例
@Test
public void test2() {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MainConfig2.class);
for (String beanName : context.getBeanDefinitionNames()) {
System.out.println(String.format(“%s->%s”, beanName, context.getBean(beanName)));
}
}
运行输出
com.javacode2018.lesson001.demo26.test2.Service2.setService1方法
service1->com.javacode2018.lesson001.demo26.test2.Service1@6069db50
service2->Service2{service1=com.javacode2018.lesson001.demo26.test2.Service1@6069db50}
案例4:@Autowired标注在方法参数上
Service1
package com.javacode2018.lesson001.demo26.test3;
import org.springframework.stereotype.Component;
@Component
public class Service1 {
}
Service2
package com.javacode2018.lesson001.demo26.test3;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class Service2 {
private Service1 service1;
@Autowired
public void injectService1(Service1 service1, String name) { //@1
System.out.println(String.format(“%s.injectService1(),{service1=%s,name=%s}”, this.getClass().getName(), service1, name));
this.service1 = service1;
}
@Override
public String toString() {
return “Service2{” +
“service1=” + service1 +
‘}’;
}
}
@1:方法上标注了@Autowired,表示会将这个方法作为注入方法,这个方法有2个参数,spring查找这2个参数对应的bean,然后注入。
第一个参数对应的bean是存在的,第二个是一个String类型的,我们并没有定义String类型bean,一会看看效果
来个总的配置文件
package com.javacode2018.lesson001.demo26.test3;
import org.springframework.context.annotation.ComponentScan;
@ComponentScan
public class MainConfig3 {
}
来个测试用例
@Test
public void test3() {
AnnotationConfigApplicat