注解
- java注解 仅作简单记录
- @BeforeClass所修饰的方法在所有方法加载前执行,而且他是静态的在类加载后就会执行该方法,在内存中只有一份实例,适合用来加载配置文件。
- @AfterClass所修饰的方法在所有方法执行完毕之后执行,通常用来进行资源清理,例如关闭数据库连接。
- @Before和@After在每个测试方法执行前都会执行一次。
- 测试方法上面必须使用@Test注解进行修饰。
- 测试方法必须使用public void 进行修饰,不能带有任何参数。
- 测试单元中的每一个方法必须独立测试,每个测试方法之间不能有依赖。
-
常用注解
@Test(excepted=XX.class) 在运行时忽略某个异常。
@Test(timeout=毫秒) 允许程序运行的时间。
@Ignore 所修饰的方法被测试器忽略。
@RunWith 可以修改测试运行器 org.junit.runner.Runner
@ComponentScan 主要就是定义扫描的路径从中找出标识了需要装配的类自动装配到spring的bean容器中,
装配标识了@Controller,@Service,@Repository,@Component注解的类到spring容器中
@Component
@Controller
@Service
@Repository
注解分类
- @Component 是可以用以所有类
- @Repository一般用于持久层操作数据库上的
- @Service 一般用于业务逻辑里面的实现类,
- @Controller 一般是用于控制器上的注解
- @Bean 一般是跟@Configuration一起用的相当于
说明
- 虽然Component注解也会当做配置类,但是并不会为其生成CGLIB代理Class。而@Configuration标注的配置类,会通过CGLIB代理Class
- @Bean就得看所在类是@Component标注,还是@Configuration标注了。
在配置类的方法间调用时,如果类时@component标注的,每次调用获取的都是新的实体;
而如果是@configuration标注的话,每次调用返回的是同一个实体Bean,
@Configuration标注下的@Bean调用函数使用都是代理对象,获取的都是从IOC容器里获取的bean,因此都是同一个。
而@Component标注下的@Bean下只是普通的函数方法调用,因此每次调用后,都是是新的对象 - 接口 org.springframework.context.ApplicationContext 代表Spring IoC容器,并负责实例化、配置和组装上述beans。容器通过读取配置元数据获取需要实例化、配置和组装的对象的指示信息。配置元数据用XML,Java注解或Java代码表示。它允许你展示组成你的应用程序的对象以及这些对象之间丰富的相互依赖关系。
- bean定义
属性 | 解释模块 | 说明 |
---|---|---|
class | 实例化Beans | |
name | Beans命名 | |
scope | Bean作用域 | |
constructor | arguments | 依赖注入 |
properties | 依赖注入 | |
autowiring | mode | 自动装配依赖 |
lazy-initialization | mode | 懒初始化Beans |
initialization | method | 初始化回调 |
destruction | method | 销毁回调 |
@ 使用说明
//ApplicationContext ctx = new ClassPathXmlApplicationContext("spring/bean.xml");// 读取bean.xml中的内容
ApplicationContext annotationContext = new AnnotationConfigApplicationContext("SpringStudy");
ClassName c = annotationContext.getBean("benName", ClassName .class);// 创建bean的引用对象
@Bean
@Bean的方法,其返回值将作为一个bean定义注册到Spring的IoC容器,方法名
将默认成为该bean定义的id
。
如果一个bean的定义依赖其他bean,则直接调用对应JavaConfig类中依赖bean的创建方法就可以了
依赖注入的都是同一个Singleton的对象实例
,Spring的参考文档中有说明,即通过拦截配置类的方法调用
来避免多次初始化同一类型对象的问题,一旦拥有拦截逻辑的子类发现当前方法没有对应的类型实例时才会去请求父类的同一方法来初始化对象实例,否则直接返回之前的对象实例。
@ComponentScan
@ComponentScan对应XML配置形式中的<context:component-scan>元素,用于配合一些元信息Java Annotation(@Component和@Repository等),将标注了这些元信息Annotation的bean定义类批量采集到Spring的IoC容器
中。
我们可以通过basePackages
等属性来细粒度地定制@ComponentScan自动扫描的范围,如果不指定,则默认Spring框架实现会从声明@ComponentScan所在类的package
进行扫描。
@ComponentScan是SpringBoot框架魔法得以实现的一个关键组件
@PropertySource与@PropertySources
@PropertySource用于从某些地方加载*.properties文件内容,并将其中的属性加载到IoC容器中,便于填充一些bean定义属性的占位符(placeholder)
,当然,这需要PropertySourcesPlaceholderConfigurer的配合。
如果我们使用Java 8或者更高版本
开发
@Configuration
@PropertySource("classpath:1.properties")
@PropertySource("classpath:2.properties")
@PropertySource("...")
public class XConfiguration{
...
}
使用低于Java 8版本
的Java开发Spring应用,又想声明多个@PropertySource,则需要借助@PropertySources的帮助了:
@PropertySources({
@PropertySource("classpath:1.properties"),
@PropertySource("classpath:2.properties"),
...
})
public class XConfiguration{
...
}
@Import与@ImportResource
在XML形式的配置中,我们通过的形式将多个分开的容器配置合到一个配置中
,在JavaConfig形式的配置中,我们则使用@Import这个Annotation完成同样目的:
@Configuration
@Import(MockConfiguration.class)
public class XConfiguration {
...
}
@Import只负责引入JavaConfig形式定义的IoC容器配置
,如果有一些遗留的配置或者遗留系统需要以XML形式来配置(比如dubbo框架),我们依然可以通过@ImportResource将它们一起合并到当前JavaConfig配置的容器中:
@Configuration
@Import(MockConfiguration.class)
@ImportResource("...")
public class XConfiguration {
...
}
自动配置
SpringBoot 自动配置主要通过 @EnableAutoConfiguration, @Conditional, @EnableConfigurationProperties 或者 @ConfigurationProperties 等几个注解来进行自动配置完成的
- @EnableAutoConfiguration
开启自动配置,主要作用就是调用 Spring-Core 包里的loadFactoryNames(),将 autoconfig 包里的已经写好的自动配置加载进来。 - @Conditional 条件注解
通过判断类路径下有没有相应配置的 jar 包来确定是否加载和自动配置这个类。 - @EnableConfigurationProperties
给自动配置提供具体的配置参数,只需要写在 application.properties 中,就可以通过映射写入配置类的 POJO 属性中。