考虑到演示代码的复用性,减少代码冗余,并保证演示的清晰性,放在一起演示的代码:共用实体类 + 共用applicationContext.xml + 共用一个测试类。
不在一起演示的,另建一个新包并重新创建以上内容。
对实体类或配置文件的修改顺序,遵循博文的演示顺序。
package com.example.s01;
import org.springframework.stereotype.Component;
@Component
public class Student {
private String name;
private int age;
public Student() {
System.out.println("Student无参构造方法被执行,实例对象被创建....");
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
<?xml version="1.0" encoding="UTF-8"?>
package com.example.test;
import com.example.s01.Student;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestComponent {
//测试Component注解
@Test
public void testComponent(){
//创建Spring容器
ApplicationContext ac = new ClassPathXmlApplicationContext("s01/applicationContext.xml");
//获取容器中的bean对象
Student student = (Student) ac.getBean("student");
System.out.println(student);
}
}
Student无参构造方法被执行,实例对象被创建....
Student{name='null', age=0}
Process finished with exit code 0
@Component("stu")
public class Student {
//...
}
public class TestComponent {
//测试Component注解
@Test
public void testComponent(){
//创建Spring容器
ApplicationContext ac = new ClassPathXmlApplicationContext("s01/applicationContext.xml");
//获取容器中的bean对象
Student student = (Student) ac.getBean("stu");
System.out.println(student);
}
}
@Component("stu")
public class Student {
@Value("荷包蛋")
private String name;
@Value("20")
private int age;
//....
}
Student无参构造方法被执行,实例对象被创建....
Student{name='荷包蛋', age=20}
Process finished with exit code 0
同源类型注入3种情况之一:完全相同的类型的注入
package com.example.s02;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
public class School {
@Value("nefu")
private String name;
@Value("哈尔滨")
private String address;
public School() {
System.out.println("School无参构造方法执行,实例对象被创建....");
}
@Override
public String toString() {
return "School{" +
"name='" + name + '\'' +
", address='" + address + '\'' +
'}';
}
}
package com.example.s02;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
public class Student {
//.....
@Autowired
private School school;
//.....
}
package com.example.test;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestAutowired {
//测试同源注入:完全相同的类型
@Test
public void testAutowired(){
//创建Spring容器
ApplicationContext ac = new ClassPathXmlApplicationContext("s02/applicationContext.xml");
//从容器中获取Student实例对象
System.out.println("学生对象: " + ac.getBean("student"));
}
}
School无参构造方法执行,实例对象被创建....
Student无参构造方法被执行,实例对象被创建....
学生对象: Student{name='荷包蛋', age=20, school=School{name='nefu', address='哈尔滨'}}
Process finished with exit code 0
@Component("theSchool")
public class School {
//.....
}
@Component
public class Student {
//.....
@Autowired
@Qualifier("theSchool")
private School school;
//.....
}
@Component
public class Student {
//.....
@Qualifier("theSchool")
private School school;
//.....
}
School无参构造方法执行,实例对象被创建....
Student无参构造方法被执行,实例对象被创建....
学生对象: Student{name='荷包蛋', age=20, school=null}
Process finished with exit code 0
同源类型注入3种情况之二:父子类型的注入
package com.example.s03;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
public class SubSchool extends School{
@Value("nefu附小")
private String name;
@Value("香坊区")
private String address;
@Override
public String toString() {
return "SubSchool{" +
"name='" + name + '\'' +
", address='" + address + '\'' +
'}';
}
public SubSchool() {
System.out.println("SubSchool无参构造方法被执行,实例对象被创建....");
}
}
package com.example.s03;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
public class Student {
//......
@Autowired
private School school;
//......
}
package com.example.s03;
import org.springframework.stereotype.Component;
@Component
public class SubSchool extends School{
//......
}
package com.example.test;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestAutowiredExtend {
//测试同源类型注入:父子类型
@Test
public void testAutowiredExtend(){
//创建Spring容器
ApplicationContext ac = new ClassPathXmlApplicationContext("s03/applicationContext.xml");
//从容器中获取Student实例
System.out.printf("Student实例: " + ac.getBean("student"));
}
}
School无参构造方法执行,实例对象被创建....
Student无参构造方法被执行,实例对象被创建....
School无参构造方法执行,实例对象被创建....
SubSchool无参构造方法被执行,实例对象被创建....
Student实例: Student{name='荷包蛋', age=20, school=School{name='nefu', address='哈尔滨'}}
Process finished with exit code 0
@Component("schoolFu")
public class School {
//......
}
@Component("school")
public class SubSchool extends School{
//......
}
School无参构造方法执行,实例对象被创建....
Student无参构造方法被执行,实例对象被创建....
School无参构造方法执行,实例对象被创建....
SubSchool无参构造方法被执行,实例对象被创建....
Student实例: Student{name='荷包蛋', age=20, school=SubSchool{name='nefu附小', address='香坊区'}}
Process finished with exit code 0
@Component
public class Student {
@Autowired
@Qualifier("schoolFu")
private School school;
//......
}
School无参构造方法执行,实例对象被创建....
Student无参构造方法被执行,实例对象被创建....
School无参构造方法执行,实例对象被创建....
SubSchool无参构造方法被执行,实例对象被创建....
Student实例: Student{name='荷包蛋', age=20, school=School{name='nefu', address='哈尔滨'}}
Process finished with exit code 0
留言与评论(共有 0 条评论) “” |