参考代码下载github:https://github.com/changwensir/java-ee/tree/master/spring4
--Spring IOC 容器可以自动装配 Bean. 需要做的仅仅是在
--byType(根据类型自动装配): 若 IOC 容器中有多个与目标 Bean 类型一致的 Bean. 在这种情况下, Spring 将无法判定哪个 Bean 最合适该属性, 所以不能执行自动装配.
--byName(根据名称自动装配): 必须将目标 Bean 的名称和属性名设置的完全相同.
--constructor(通过构造器自动装配): 当 Bean 中存在多个构造器时, 此种自动装配方式将会很复杂. 不推荐使用
public class Car2 {
private String brand;
private float price;
private String company;
public Car2() {
System.out.println("CarCycle'2 constructor...");
}
//....省去get,set方法
}
public class PersonAutowire {
private String name;
private Address address;
private Car2 car;
public PersonAutowire() {
}
//....省去get,set方法
}
public class Address {
private String city;
private String street;
//....省去get,set方法
}
配置文件beans-autowire.xml
?xml version="1.0" encoding="UTF-8"?>
测试方法
/**
* 自动装配 Bean
* byType(根据类型自动装配)
* byName(根据名称自动装配)
* constructor(通过构造器自动装配):不推荐使用
*/
@Test
public void testAutowire() {
ApplicationContext ctx = new ClassPathXmlApplicationContext("Spring4_IOC/beans-autowire.xml");
//测试自动装配byName
PersonAutowire person = (PersonAutowire) ctx.getBean("person");
System.out.println("测试自动装配byName: " + person);
//测试自动装配byType
PersonAutowire person2 = (PersonAutowire) ctx.getBean("person2");
System.out.println("测试自动装配byType: " + person2);
}
XML 配置里的 Bean 自动装配的缺点
/**
* bean 之间的关系:继承;依赖
*/
@Test
public void testRelation() {
ApplicationContext ctx = new ClassPathXmlApplicationContext("Spring4_IOC/beans-relation.xml");
//测试继承
Address address = (Address) ctx.getBean("address");
System.out.println(address);
Address address2 = (Address) ctx.getBean("address2");
System.out.println(address2);
//测试依赖
PersonAutowire person = (PersonAutowire) ctx.getBean("person");
System.out.println("测试依赖: " + person);
}
/**
* bean 的作用域:
* singleton:默认值,容器初始时创建bean实例,在整个容器的生命周期内只创建这一个bean.单例的
* prototype:原型的,容器初始化时不创建bean的实例,而在每次请求时都创建一个新的bean实例!!,
* 并返回WEB 环境作用域(request,sessionPojo)
*/
@Test
public void testScope() {
ApplicationContext ctx = new ClassPathXmlApplicationContext("Spring4_IOC/beans-scope.xml");
Car2 car1 = (Car2) ctx.getBean("car");
Car2 car2 = (Car2) ctx.getBean("car");
System.out.println(car1 == car2); //默认是singleton,结果为true,如果为prototype则为false
}
user=root
password=123456
driverClass=com.mysql.jdbc.Driver
jdbcUrl=jdbc:mysql:///test
/**
* 使用外部属性文件
*/
@Test
public void testProperties() {
ApplicationContext ctx = new ClassPathXmlApplicationContext("Spring4_IOC/beans-properties.xml");
DataSource dataSource = (DataSource) ctx.getBean("dataSource");
System.out.println(dataSource);
}