隔了两天,忙着面试,快累死了,终于有空来写博客了。好了,发完牢骚,进入咱们今天的学习。面试
上篇spring学习4-bean配置文件中学习了使用xml配置文件配置bean,是否是以为不淡定,每写一个类,就得来注册一下,xml文件得多大。好在spring中提供另外一种bean的配置方式,使用注解配置bean。spring
首先得了解一下注解,注解是jdk1.5才添加的新特性,具体注解怎么写,我就很少说了,我在osc博客里搜到一篇很不错的文章,不了解的童鞋能够去瞧瞧Java注解总结。api
配置文件仍是免不了的,须要在配置文件中使用<context:component-scan>标签才能让spring去扫描注解。先准备一下前期工做吧。app
在spring的api文档xsd-config能够找到context的命名空间,把加粗的两行加入到applicationContext.xml里。框架
下一步,咱们在配置文件中加入bean扫描的标签,其中只有一个属性,base-package,指定须要扫描的包maven
< context:component-scan base-package ="com.example.spring" ></ context:component-scan >
这样咱们的注解就能够被扫描到了,工具
题外话,在网上搜到能够用测试用例来测试咱们写的代码,不用每次都写学习
ApplicationContext context = new ClassPathXmlApplicationContext( " applicationContext.xml " ); Car car = (Car) context.getBean( " car " );
这样的代码了。测试
-------------------------------------我是华丽的分割线---------------------------------------spa
先讲一下怎么测试
首先在pom.xml里须要加入两个包,一个是junit4,一个是spring的测试框架,原来建立maven工程自带的junit版本过低,很差用。
< dependency > < groupId > org.springframework </ groupId > < artifactId > spring-test </ artifactId > < version > 3.2.8.RELEASE </ version > < scope > runtime </ scope > </ dependency > < dependency > < groupId > junit </ groupId > < artifactId > junit </ artifactId > < version > 4.11 </ version > </ dependency >
而后咱们写一下测试类,就叫CarTest好了,名字随便。
@RunWith(SpringJUnit4ClassRunner. class ) @ContextConfiguration(locations = " classpath:applicationContext.xml " ) public class CarTest { @Test public void demo1(){ } }
整个测试类框架大概就是这样子
第一行@RunWith(SpringJUnit4ClassRunner.class)是整合spring和junit4用的
第二行@ContextConfiguration(locations="classpath:applicationContext.xml")是指定applicationContext.xml文件
demo1方法上的注解就是标注这个方法由junit运行,须要运行测试用例的时候按下图来,在方法名上点右键,选debug as或是run as中的 JUnit Test便可,很是方便
-------------------------------------我是华丽的分割线再一次出现---------------------------------------
如今咱们修改一下以前的Car类和Engine类
在QiyouEngine类名上面一行添加 @Component("qiyouEngine"),这个的做用和xml配置中Bean id=”qiyouEngine”是同样的
在Car类中咱们在private IEngine engine;上面添加两个标记,第一标记标识自动装配,这个标记是按类型进行装配的,若是是有多个类实现了IEngine,就须要写@Qualifier("qiyouEngine")指明bean的id是哪一个,否则spring会报错,说找到多个实现了IEngine类。
@Autowired @Qualifier( " qiyouEngine " ) private IEngine engine;
这是一种写法,spring推荐使用另外一个标签@Resource,两种方法效果是同样的
@Resource(name = " qiyouEngine " ) private IEngine engine;
使用了自动装配标签,本来set的方法就能够去掉了,spring使用的是asm工具,直接操做字节码注入类,没有set的方法也是能够注入的。
最后须要说明的一点,注解的方式只试用类是咱们本身写的,或是咱们能够进行修改代码的才有用,若是是第三方类,就只能老老实实的用xml配置文件了。