4.1.2.RELEASE版本的Spring支持3种配置方式
- 基于XML配置
- 基于注解
- 基于Java类
1.基于XML的配置
这种方式是经典方式,即使Spring不断发展,也必须向前兼容这种方式。装配一个Bean有3种方式。
1.1 属性注入
这种方式是最常用的方式,基于POJO类中的Set方法,为属性注入参数。
public class Car { private int maxSpeed; private String brand; private double price; // Getter Setter // introduce方法将各参数打印出来 }
100 红旗CA97 20000.00
可以在main方法中使用如下方法可以访问
ApplicationContext application = new ClassPathXmlApplicationContext("applicationContext.xml"); Car car = (Car) application.getBean("car"); System.out.println(car.introduce());
*****需要注意的是,在配置Bean的Property时,比如
1.2 构造函数注入
1.2.1 按构造函数的参数的类型进行匹配入参
public Car(String brand, double price) { this.brand = brand; this.price = price; }
红旗CA72 70 20000
****注意,这种方式,根据入参类型就可以确定如何绑定的情况下不需要保证顺序和Java构造方法的参数顺序一致。
1.2.2 按索引匹配入参
如果入参存在两个相同类型的参数,那使用上面一种方式就没办法唯一确定了,这个时候需要根据入参的索引来确定,第一个参数的索引是"0",第二个是"1",一次类推
1.2.3 联合使用类型和索引匹配入参
如果分别使用上面两种方式还是没有办法绑定,比如有多个构造函数,其中有一个参数类型不同,这种情况下可以联合使用上面两种方法。
1.2.4 通过反射匹配入参
如果入参的类型是可以辨别的,比如自定义的Car类,Office类这种,在构造函数中引用了这些类,在XML配置的时候,可以不加type和index,由框架自动注入。
public Boss(String name, Car car, Office office) { // 省略 }
John
1.3 工厂方法注入
分静态工厂方法和非静态工厂方法,这种方法在IoC中用的不多,就跳过不提了。
2.基于注解的方式
基于XML的方式实在过繁杂,书写起来也容易犯错,所以现在更多的是使用基于注解的方式。
在使用基于注解的方式配置Bean之前,需要先告诉Spring有哪些程序包是需要被扫描的
通过以下方式可以启动容器
ApplicationContext ctx = new AnnotationConfigApplicationContext(AppConf.class); LogonService logonService = ctx.getBean(LogonService.class); logonService.printHello();
像上面这个例子里面,UserDao和LogDao实际上是加上了Getter Setter方法的,实际上没必要在这两个Dao中加上Setter方法,只需要在LogonService中给这两个属性加上@Autowired注解,就会自动注入了。
3.2 多Config文件组合
@Configuration public class DaoConfig { @Bean public UserDao userDao() { return new UserDao(); } @Scope("prototype") @Bean public LogDao logDao() { return new LogDao(); } } @Configuration @Import(DaoConfig.class) // 使用这行代码就就可以引用其他的注解配置类 public class ServiceConfig { @Autowired private DaoConfig daoConfig; @Bean public LogonService logonService() { LogonService logonService = new LogonService(); // 这里没有加上Setter方法,是因为LogonService中使用了Autowired注解 return logonService; } }
如下,如果没有使用Import注解的话,需要在启动容器的时候,把所有的Java注解配置类都注册上
AnnotationConfigApplicationContext ctx1 = new AnnotationConfigApplicationContext(); // ctx1.register(DaoConfig.class); // 如果没有使用Import注解的话,一定要记得加上 ctx1.register(ServiceConfig.class); ctx1.refresh(); LogonService logonService1 = ctx1.getBean(LogonService.class); logonService1.printHello();
3.3 在XML配置中引用@Configuration配置,很简单,只需要
3.4 在Configuration中引用XML配置信息,只需要在类上加上@ImportResource("classpath:com/firethewhole/conf/bean3.xml"),然后对应的每个方法都需要参数并且加上Autowired属性
@Configuration @ImportResource("classpath:beans3.xml") public class LogonAppConfig { @Bean @Autowired public LogonService logonService(UserDao userDao, LogDao logDao) { LogonService logonService = new LogonService(); logonService.setLogDao(logDao); logonService.setUserDao(userDao); return logonService; } }