实例12:引用外部属性文件
举例应用场景:对于数据库连接池,只需要创建一个连接池即可,从中获取连接对象。因此可以用IOC容器进行配置组件。
>数据库连接池的配置文件(dbconfig.properties)
jdbc.username=root
jdbc.password=root
jdbc.jdbcUrl=jdbc:mysql://localhost:3306/customersdb
jdbc.driverClass=com.mysql.jdbc.Driver
>在IOC容器中引入Context名称空间
>通过
>通过 ${ } 来动态获取配置文件中的value值,并且需要注意的是,为了防止username和Spring中自带的username发生冲突,因此在配置
文件中应该在所有key值前加前缀,来避免冲突
>最后在类文件中获取IOC容器,并在方法中通过getBean方法获取数据连接池对象,并调用其方法获得连接对象
public class IOCTest {
ConfigurableApplicationContext ioc = new ClassPathXmlApplicationContext("applicationContext02.xml");
@Test
public void test02() throws SQLException {
// DataSource bean = (DataSource)ioc.getBean("dataSource");
//按照类型获取组件,可以获取到这个类型下的所有实现类子类等
DataSource bean = ioc.getBean(DataSource.class);
System.out.println(bean.getConnection());
}
}
>需要注意的是,刚才在编码过程中,出现了java.lang.NoClassDefFoundError: com/mchange/v2/ser/Indirector的错误,出现错误原因是没有导入mchange-commons-java-0.2.11.jar。
实例13:基于XML的自动装配
举例应用场景:自动装配应用于自定义类型属性。假如一个类中的属性为自定义类,在Bean中配置时,可以通过
自动装配:根据指定的装配规则,不需要明确指定,就可以让Spring自动将匹配的属性值注入Bean中。
装配模式:①
②
③
④
♥大多时候会使用注解方式来实现自动装配,在XML文档中进行的自动装配会显得不方便,实际项目中更多使用注解的方式实现。
♥当一个类中的属性时自定义类型的集合时,当自动装配时,会将所有符合autowire条件的Bean都装入该集合中。
实例14:SpEL(Spring Expression Language)测试
SpEL的语法符号为:#{...}
>使用字面量进行赋值
>引用其他Bean的某个属性值
>引用其他Bean,(不需要ref=""来引用其他Bean)
>调用静态方法:#{T(全类名).静态方法名(参数)}
>调用非静态方法:#{对象.方法名}
※实例15:通过注解分别创建Dao、Service、Controller
@Controller
public class BookServlet {
}
public class IOCTest {
ApplicationContext ioc = new ClassPathXmlApplicationContext("applicationContext.xml");
/*
* 使用注解加入到容器中的组件,和使用配置加入到容器中的组件行为默认都是一样的;
* 1.组件的id,默认就是组件的类名首字母小写
* 2.组件的作用域,默认都是单例的
* >也可以新写组件的新名字通过()
* >也可以将组件的作用域改为多实例,@Scope(value="prototype")
* */
@Test
public void test() {
Object bean = ioc.getBean("bookDao");
Object bean1 = ioc.getBean("bookDao");
System.out.println(bean == bean1);
}
}
实例16:使用context:include-filter指定扫描包时要包含的类
实例17:使用context:include-filter指定扫描包时不包含的类
※实例18:使用@Autowired注解实现根据类型实现自动装配
/*
* @Autowired:Spring会自动的为这个属性赋值;
* 一定会去容器中找到这个属性对应的组件
* */
@Controller
public class BookServlet {
//自动装配,自动的为这个属性赋值,不需要new一个对象
@Autowired
private BookService bookService;
}
@Autowired注解
[1]根据类型实现自动装配。
[2]构造器、普通字段(即使是非public)、一切具有参数的方法都可以应用@Autowired注解
[3]默认情况下,所有使用@Autowired注解的属性都需要被设置。当Spring找不到匹配的bean装配属性时,会抛出异常。
[4]若某一属性允许不被设置,可以设置@Autowired注解的required属性为 false
[5]默认情况下,当IOC容器里存在多个类型兼容的bean时,Spring会尝试匹配bean的id值是否与变量名相同,如果相同则进行装配。如果bean的id值不相同,通过类型的自动装配将无法工作。此时可以在@Qualifier注解里提供bean的名称。Spring甚至允许在方法的形参上标注@Qualifiter注解以指定注入bean的名称。
[6]@Autowired注解也可以应用在数组类型的属性上,此时Spring将会把所有匹配的bean进行自动装配。
[7]@Autowired注解也可以应用在集合属性上,此时Spring读取该集合的类型信息,然后自动装配所有与之兼容的bean。
[8]@Autowired注解用在java.util.Map上时,若该Map的键值为String,那么 Spring将自动装配与值类型兼容的bean作为值,并以bean的id值作为键。
※实例19:如果资源类型的bean不止一个,默认根据@Autowired注解标记的成员变量名作为id查找bean,进行装配
※实例20:如果根据成员变量名作为id还是找不到bean, 可以使用@Qualifier注解明确指定目标bean的id
public class BookServlet {
//自动装配,自动的为这个属性赋值,不需要new一个对象
//@Qualifier:指定一个名字作为该组件的id,让Spring不要使用变量名作为id
@Qualifier("bookService")
@Autowired
private BookService bookServiceExt2;
}
※实例21:@Autowired注解的required属性指定某个属性允许不被设置:@Autowired(required="false")
总结@Autowired流程:
1>按照所注解的类型去Spring容器中寻找对应的组件:BookService bookService = ioc.getBean(BookService.class)
(1)如果找到一个对应的组件,则赋值给变量bookService;
(2)如果没找到,则抛出异常
(3)如果找到多个(例如会将bookService所有的子类找出)
①根据变量名作为id继续匹配:
如果匹配上,则装配;匹配不上,则报错。
如果想要根据变量名作为id继续匹配,可以使用@Qualifier("")指定一个新id
@Autowired和@Resource的区别
@Autowired:是Spring自己的注解,相比较来说功能强大一些,但如果离开Spring框架就不能使用
@Resource:是Java中的注解,扩展性强,如果换一个不是Spring的容器框架(例如EJB),该注解依然可以使用
使用Spring的单元测试
好处:不需要自己通过getBean方法获取组件,直接通过注解就可以让Spring自动装配
/*
* 使用Spring的单元测试
* 1.导包:导入Spring单元测试包 spring-test-4.0.0.RELEASE.jar
* 2.@ContextConfiguration(LOCATION="")使用它来指定Spring的配置文件的位置
* 3.@RunWith指定用那种驱动进行单元测试,默认是junit
* @RunWith(org.springframework.test.context.junit4.SpringJUnit4ClassRunner.class)
* 使用Spring的单元测试模块来执行标了@Test注解的测试方法
* 以前@Test注解只是由junit执行,现在Spring中的单元测试模块会根据指定的配置文件自动帮你创建ioc容器
* */
@ContextConfiguration(locations="classpath:applicationContext.xml")
@RunWith(org.springframework.test.context.junit4.SpringJUnit4ClassRunner.class)
public class IOCTest {
//ApplicationContext ioc = new ClassPathXmlApplicationContext("applicationContext.xml");
ApplicationContext ioc = null;
@Autowired
BookServlet bookServlet;
@Test
public void test() {
System.out.println(bookServlet);
}
}
✳实例23:测试泛型依赖注入
Spring 4.x中可以为子类注入子类对应的泛型类型的成员变量的引用。