JAVA官方注解框架:
JSR 303 数据合法性校验标准框架
JSR 330 容器依赖注入注解
注解可以包含属性和方法
属性是没有参数的方法,方法名即为属性名,方法的返回值即使属性的类型。可以使用default定义默认值
方法
注解的字段之上可以在使用注解注释。
各种框架的注解:
Spring框架的注解
Hibernate框架的注解
注解:
注解的可继承性
如果父类使用的注解被标示为可继承,则其子类默认具有父类的可继承注解
在Class的实现中,注解数据分为两部分:
类的所有注解 getAnnotations
类的所有注解= 类自身直接声明的注解 + 继承自父类的注解
类声明的注解 getDeclaredAnnotations
类自身直接声明的注解
Class
Class代表类和接口。注解是接口,默认继承自Annotation接口,就像所有的类都默认继承自Object。所以Class也可以用于提取
注解的信息。
getAnnotatedInterfaces
获取注解实现的接口。
getAnnotatedSuperclass
获取带注解的父类。如果继承的父类带注解,则返回。
GenericDeclaration
泛型声明,Class继承,表示类的泛型信息。
TypeVariable
用以表示泛型的类型变量,类型变量提供类型的边界,泛型的声明信息,类型名。在泛型的时候用
Type
类型,代表类的类型,每个类都是类名。面向对象中的类型。类型名就是自定义类的类名,Class实现返回,
getName = getTypeName (数组类型是个列外)
AnnotatedElement
表示类能被注解,提供注解的相关信息,有Class,Method, Field, Constructor这些反射类实现,获取类型的注解信息。
AnnotatedType
注解的类型,和Type类型,用于标示类的类型名,此AnnotatedType标示主机的类型名,一般就是注解接口名。
Annotation
Class<? extends Annotation> annotationType(); 返回注解对应的类类型,一如普通类的Class
一个应用的加载流程:
Spring注解APT
StandardAnnotationMetadata 对注解类进行注解元数据自省。
ConditionEvaluator.shouldSkip @Conditional check
Spring注解配置框架:
@Configuration
1、类XML配置文件的功能,可以在其中声明使用@Bean注释的方法,用于导入Bean到Spring Bean容器中
@Configuration
public class AppConfig {
@Bean
public MyBean myBean() {
// instantiate, configure and return bean ...
}
}
2、使用@Configuration注解作为上下文的资源配置文件,配合使用@Import、@ImportResource,以下几个Spring上下文可以使用
AnnotationConfigApplicationContext、AnnotationConfigWebApplicationContext。
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
ctx.register(AppConfig.class);
ctx.refresh();
MyBean myBean = ctx.getBean(MyBean.class);
也可以这样:扫描配置文件,从配置文件加载注解类。
<beans>
<context:annotation-config/>
<bean class="com.acme.AppConfig"/>
</beans>
3、可以<context:component-scan/>被组件扫描器扫描加载
4、可以在@Configuration修饰的配置文件上使用@ComponentScan
@Configuration
@ComponentScan("com.acme.app.services")
public class AppConfig {
// various @Bean definitions ...
}
5、在@Configuration修饰的配置使用外部值,通过引入Enviroment
@Configuration
public class AppConfig {
@Inject Environment env; //也可以使用@Autowire
@Bean
public MyBean myBean() {
MyBean myBean = new MyBean();
myBean.setName(env.getProperty("bean.name"));
return myBean;
}
}
6、可以使用properties文件,使用@Properties注解,将properties文件注入到Enviroment实例中
@Configuration
@PropertySource("classpath:/com/acme/app.properties")
public class AppConfig {
@Inject Environment env;
@Bean
public MyBean myBean() {
return new MyBean(env.getProperty("bean.name"));
}
}
7、使用@PropertySource和@Value配合使用,引入外部值
@Configuration
@PropertySource("classpath:/com/acme/app.properties")
public class AppConfig {
@Value("${bean.name}") String beanName;
@Bean
public MyBean myBean() {
return new MyBean(beanName);
}
}
8、@Configuration和@Import组合使用:
@Configuration
public class DatabaseConfig {
@Bean
public DataSource dataSource() {
// instantiate, configure and return DataSource
}
}
@Configuration
@Import(DatabaseConfig.class)
public class AppConfig {
@Inject DatabaseConfig dataConfig;
@Bean
public MyBean myBean() {
// reference the dataSource() bean method
return new MyBean(dataConfig.dataSource());
}
}
9、@Profile、@Configuration结合使用,那个Profile被激活,加载那个类
@Profile("embedded")
@Configuration
public class EmbeddedDatabaseConfig {
@Bean
public DataSource dataSource() {
// instantiate, configure and return embedded DataSource
}
}
@Profile("production")
@Configuration
public class ProductionDatabaseConfig {
@Bean
public DataSource dataSource() {
// instantiate, configure and return production DataSource
}
}
10、@Configuration和@ImportResource结合使用
@Configuration
@ImportResource("classpath:/com/acme/database-config.xml")
public class AppConfig {
@Inject DataSource dataSource; // from XML
@Bean
public MyBean myBean() {
// inject the XML-defined dataSource bean
return new MyBean(this.dataSource);
}
}
11、使用内嵌的@Configuration,内嵌的@Configuration可以和@Profile结合使用,提供可选项。
@Configuration
public class AppConfig {
@Inject DataSource dataSource;
@Bean
public MyBean myBean() {
return new MyBean(dataSource);
}
@Configuration
static class DatabaseConfig {
@Bean
DataSource dataSource() {
return new EmbeddedDatabaseBuilder().build();
}
}
}
12、@Configuration懒加载。使用@Bean修饰的方法都是立即创建实例,可以使用@Lazy修饰符,来实现懒加载。
@Configuration
public class AppConfig {
@Inject DataSource dataSource; // from XML
@Lazy
@Bean
public MyBean myBean() {
// inject the XML-defined dataSource bean
return new MyBean(this.dataSource);
}
}
13、Spring框架支持@Configuration,使用@ContextConfiguration
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes={AppConfig.class, DatabaseConfig.class})
public class MyTests {
@Autowired MyBean myBean;
@Autowired DataSource dataSource;
@Test
public void test() {
// assertions against myBean ...
}
}
14、和其他注解结合使用@Enable、@EnableAsync、@EnableScheduling、@EnableTransactionManagement、@EnableAspectJAutoProxy
@EnableWebMvc。
15、一个应用可以使用一个@Configuration修饰的AppConfig拉起应用。通过@Import @ImportResource导入关联。将这个配置文件传给
Spring容器的启动类。
对应的注解解析器是ConfigurationClassPostProcessor。使用注解要保证所有的注解解析器能正确加载到Spring容器中。
使用@Configuration修饰的类必须满足以下条件:
classes must be non-final
classes must be non-local (may not be declared within a method)
classes must have a default/no-arg constructor and may not use @Autowired constructor parameters.
Any nested configuration classes must be static.
@Import
1、可以引入一个或多个@Configuration修饰的类。
2、引入@Component修饰的类
3、引入ImportSelector实现,解析器自动调用selectImports方法
4、ImportBeanDefinitionRegistrar实现,解析器自动调用registerBeanDefinitions方法
5、提供了XML配置文件<import/>同样的功能
6、可以作为元注解或者使用在Class上,接口/注解/类都是Class。
@ImportResource
1、提供和<bean/>类似的功能
2、引入Groovy文件,需满足GroovyBeanDefinitionReader能处理
3、引入XML文件,需满足XmlBeanDefinitionReader能处理
4、可以声明自定义的解析器
@Bean
1、作用同XML配置的<bean/> 一般在@Configuration注解修饰的类中使用
@Configuration
public
class Bootstrap {
@Bean
public MyBean myBean(){
// instantiate and configure MyBean obj
return obj;
}
}
2、为Bean声明一个或多个别名、作用域、依赖、是否懒加载。
@Configuration
public
class Bootstrap {
@Bean({"b1","b2"})
@Scope("prototype")
@Lazy
@DependsOn
@Primary
public MyBean myBean(){
// instantiate and configure MyBean obj
return obj;
}
}
3、@Bean一般都在@Configuration中使用
4、@Bean在lite mode中使用,即在普通类或者带有@Component修饰的类中使用,@Bean修饰的方法会被Spring容器当做是
Bean创建工厂方法,同XML配置中的factory-method类似。
@Component
public class Calculator {
public int sum(int a, int b) {
return a+b;
}
@Bean
public MyBean myBean() {
return new MyBean();
}
}
@Conditional
注解关系
@Component
@Configuration @Service @Controller @Repository