Spring新注解
Configuration&&ComponentScan
在前面的xml注解中,我们会用到扫描自己的类,只能注解自己定义的类.而像Runner这些 还是需要用Constructor注入方式来注入.所以就有了新的注解方式,可以对所有的进行注解.
- 与resources同级目录下创建一个config包,写一个java文件.
- 该类是一个配置类,作用和bean.xml一样.
- 新注解 :
- @Configuration 指定当前类是一个配置类 .
*** 细节:当配置类作为AnnotationConfigApplicationContext对象创建的参数时,该注解可以不写.***
** 当扫描包下的配置类时,只有加了@configuration 才能被扫到. 比如config下的JdbcConfig,获取对象时配置类的class 写的依然是SpringConfig,里面什么都没有,只有@ComponentScan 注解要扫描的包({“com.hk”,“config”}),一样会去读取加了@configuration 的JdbcConfig.**
一般都是一个 SpringConfig的大配置类,去扫描其他的小配置类.
XML中QueryRunner是通过Constructor方式注入DataSource数据.而在这里,是创建一个方法,返回值是QueryRunner, 参数是DataSource. XML注入后就直接将class指向的对象写进了spring容器中.而该方法没有存入,所以能存入Spring容器中 这两个方式就相等了. 传入的参数DataSource继续用@bean注解写就好.返回值为DataSource数据源对象.
于是有了**@Bean** 用于把当前方法的返回值作为bean对象存入spring的IOC容器中.
此时为单例对象, 要在该类前加上个注解@Scope(“prototype”)
属性: name:指定bean的id,当不写时,默认值是当前方法的名称.
当我们用注解配置方法时,方法有参数,spring会去容器中找有没有可用的bean对象.查找方法同AutoWired .当有多个时,找名称相同的,当名称也没相同时报错. AutoWired里面所说的不改参数名用@Qualifier在这里也有,就是那里面的不需要配合AutoWired使用的情况,给方法参数注入. - @ComponentScan用于通过朱注解指定spring在创建容器时要扫描的包.
属性:value 同 basePackages的作用是一样的,用于扫描… 等同于xml中配置了<context:component-scan base-package="com.hk">
是一回事. - @Import 也可以不写@ComponentScan 和@Configuration 可以直接用@Import 在主配置类导入其他配置类的字节码. @Import(JdbcConfig.class)
- @Configuration 指定当前类是一个配置类 .
AnnotationConfigApplicationContext
以前获取容器 都用的是 ApplicationContext的实现类 ClassPathXmlApplicContext读取的是("bean.xml")文件.而现在用的是注解.所以用的是另一个实现类AnnotationConfigApplicationContext. **参数传入的是注解类的Class**
Value标签给成员变量配置文件数据
@value("${jdbc.driver}") [Spring的EL表达式]
private String driver;
jdbc.driver来自哪里 所以就有了 @propertySource 在主配置文件指明位置. properties一般都写在最外层的resources下, 位置在哪:还需要加路径. 关键字classpath表示类路径下… 所以应写成 @PropertySource(“classpath:com/hk/jdbcConfig.properites”) (这是假如在resources/com/hk里面)
由上可以看出,纯注解可以,但反而更加复杂了.所以还是用自定义的类用注解,给的类用XML来注入更好.
Spring整合JUnit
Junit 集成了一个main方法,JUnit不会知道是否使用了spring框架,所以在测试方法执行时没有IOC容器.
Spring整合Junit
- 导入Spring整合Junit的jar包. spring-test. 当使用Spring 5.x时,junit必须是4.12及以上.
- 使用Junit提供的一个注解把原有的main方法替换成Spring提供的. @RunWith(SpringJUnit4ClassRunner.class)
- 告知spring的运行器,spring和IOC创建是基于xml还是注解,并说明位置 @ContextConfiguration 属性有:location: 指定xml文件的位置,加上classpath关键字. classes:指定注解类所在的位置.提供字节码