Spring注解配置框架
为什么80%的码农都做不了架构师?>>>
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
转载于:https://my.oschina.net/773355/blog/2986797
Spring注解配置框架相关推荐
- Spring注解配置工作原理源码解析
一.背景知识 在[Spring实战]Spring容器初始化完成后执行初始化数据方法一文中说要分析其实现原理,于是就从源码中寻找答案,看源码容易跑偏,因此应当有个主线,或者带着问题.目标去看,这样才能最 ...
- spring注解配置
使用注解配置需要引入xml文件约束条件 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns ...
- Spring 注解配置
2019独角兽企业重金招聘Python工程师标准>>> http://my.oschina.net/u/1157906/blog/178204 Spring的注解配置 转载于:ht ...
- spring注解配置quartz
常规配置quartz可以参考我的另外一篇博文:http://www.cnblogs.com/yangzhilong/p/3349116.html spring配置文件里增加: 命令空间: http:/ ...
- [内容有误,请看参考和评论区]Spring 注解配置(annotation-config 和 component-scan的不同)
[内容有误,请看参考和评论区]Spring 的xml配置里如何仅通过注解使用(annotation-config 和 component-scan的不同) 这个问题也算看了好几遍还没记住的问题,先抛结 ...
- CXF的Spring注解配置及使用
使用的cxf包版本为 cxf-2.6.1.jar 官方下载地址:CXF下载地址 web.xml配置 <servlet><servlet-name>CXFServ ...
- 【Spring】Spring注解配置okhttp3
1.概述 maven引入如下 <dependency><groupId>com.squareup.okhttp3</groupId><artifactId&g ...
- Java注解和xml_Spring注解配置和xml配置优缺点比较
Spring注解配置和xml配置优缺点比较 编辑 在昨天发布的文章<spring boot基于注解方式配置datasource>一文中凯哥简单的对xml配置和注解配置进行了比较.然后朋 ...
- AOP底层原理与注解配置详解
注解开发AOP制作步骤: 在XML格式基础上 导入坐标(伴随spring-context坐标导入已经依赖导入完成 开启AOP注解支持 配置切面@Aspect 定义专用的切入点方法,并配置切入点@Poi ...
- 深入学习Spring框架(二)- 注解配置
1.为什么要学习Spring的注解配置? 基于注解配置的方式也已经逐渐代替xml.所以我们必须要掌握使用注解的方式配置Spring. 关于实际的开发中到底使用xml还是注解,每家公司有着不同的使用习惯 ...
最新文章
- python 报错 IndentationError: expected an indented block SyntaxError: invalid character in identifie
- 多媒体课程设计android,基于Android的多媒体播放器(课程设计)报告.doc
- 为何 IntelliJ IDEA 比 Eclipse 更好?
- 知识产权创业的比赛结果
- C# 实验四 修改版 获取系统时间、点击加一秒功能
- F# -- TCP/IP小测试
- python输入序列语句_Python基础教程(一) - 序列:字符串、列表和元组
- ASP用正则验证邮箱地址手机号码电话号码格式
- 使用fastapi时在py文件中无法正常引用
- Varnish 缓存服务器配置
- iWebShop 二次开发之商城后台模板渲染流程
- 互联网晚报 | 11月18日 星期四 | 看点直播将于11月30日停止服务;B站月活用户达2.67亿;高通宣布进军汽车领域...
- 【CSS笔记】CSS实现后台管理系统主界面布局
- 风之谷mobi-宫崎骏漫画kindle7本
- C# OPCUA 读写结构体
- HTTP之Referrer和Referrer-policy
- Java中有几种方法可以实现一个线程??用什么关键字修饰同步方法??stop()和suspend()方法为什么不推荐使用??
- 名片管理系统 #python项目 #演练 #增删改查CRUD #全程教程
- Unity-多米诺骨牌
- 数字人民币智能合约的一个颠覆式创新应用
热门文章
- 牛腩学ASP.NET CORE做博客(视频)
- JSON中JObject和JArray,JValue序列化(Linq)
- vsftpd单用户多目录配置
- 过滤掉文本中的javascript标签代码
- 工业机器人操作机设计原则和设计方法
- VPP 助你创新更高效、更灵活的报文处理方案
- Libevent源码分析-----开篇
- 深入解读Linux内存管理系列(6)——地址空间划分
- Linux kernel中 __bitmap_weight函数的理解
- Linux 文件系统(二)---执行过程及结构间的关系