Spring in Action学习笔记(1)
Spring基础
IoC 控制反转, 也称为DI-依赖注入
一、装配bean
推荐顺序:自动装配 -> JavaConfig装配 -> XML装配
1. 自动装配
@Component 注解:表明该类会作为组件类,并告知Spring要为这个类创建bean。该bean的ID为第一个字母小写的类名;
@ComponentScan 注解:告诉Config配置类启用组件扫描,默认扫描的基础包为该配置类相同的包以及下面的子包。
@Autowired 注解:将bean注入对象中
@Test 注解:测试用,单元测试junit需要使用junit-4.x.jar + hamcrest-core-1.x.jar@Component("yourName") 注解:为bean指定一个ID。@Named("yourName")作用相同。
以下方式可以手动指定组件扫描的基础包:
- @ComponentScan("yourBasePackage")
- @ComponentScan(basepackages = "yourBasePackage")
- @ComponentScan(basepackages = {"yourBasePackage1", "yourBasePackage2"})
以上例子使用String来表示基础包,类型不安全(not type-safe)。
直接指定包中的类或接口:(标记空接口)
- @ComponentScan(basePackageClasses = {class1.class, class2.class})
@Autowired 还可作用于函数的参数。@Inject 作用基本相同
2. JavaConfig装配
此种方法不需要@Component和@ComponentScan
@Configuration 注解表明某类是一个配置类
@Bean 注解告诉Spring,该方法会返回一个对象,该对象要注册为Spring上下文中的bean。默认该bean的ID与方法名一致。
@Bean(name = "yourBeanName") 可以指定bean的ID。
3. XML装配
- [ ] TODO
二、高级装配
Profile注解
@Profile("dev"/"prod"/"qa") 注解配置类或bean,表明是开发环境、生产环境、QA环境时才创建对应的bean。
通过设置spring.profiles.active属性或spring.profiles.default属性来激活对应的profile
- 作为DispatcherServlet的初始化参数
- 作为Web应用的上下文参数
- 作为JNDI条目
- 作为环境变量
- 作为JVM的系统属性
- 在集成测试类上,使用@ActiveProfiles注解设置
条件化的bean
@Conditional(thisIsACondition.class) 注解,thisIsACondition类实现Condition接口,
public interface Condition{
boolean matches(ConditionContext ctxt, AnnotatedTypeMetadata metadata);
}
matches返回true时,对应被注解的bean会被创建
自动装配歧义
当@Component注解的多个class都实现了某个interface时,被@Autowired注解的函数使用该接口作为参数时,出现歧义:
@Primary 注解首选的bean
@Qualifier("wantedBean") 注解与@Autowired或@Inject组合使用,所设置的参数是想注入的bean的限定符(若没有指定其它限定符,bean的限定符默认与ID一致)
@Qualifier("xxx") 注解与@Component或@Bean组合使用,手动设置bean的限定符
当想使用多个限定符来精确缩小可选bean时,由于不能在一个条目上使用多个@Qualifier,可以自定义一个@xxx注解,在定义时加上@Qualifier注解,这个自定义注解就成为了限定符注解
@Target({ElementType.CONSTRUCTOR, ElementType.FIELD
ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Qualifier
public @interface xxx(){}
bean的作用域
- 单例(Singleton):在整个应用中,只创建bean的一个实例,默认。
- 原型(Prototype):每次注入或者通过Spring应用上下文获取的时候,都会创建一个新的bean实例。
- 会话(Session):在Web应用中,为每个会话创建一个bean实例.
- 请求(Request):在Web应用中,为每个请求创建一个bean实例.
@Scope与@Component或@Bean组合使用:
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
@Scope("prototype")
运行时注入
@PropertySource("classpath:/a/b/c/app.properties") 注解配置类,声明属性源。通过Environment来检索属性。
Environment env;
env.getProperty("some.property");
getProperty(): 获取属性值
getRequiredProperty(): 这个属性必须要定义,否则抛出IllegalStateException异常
containsProperty(): 检查一下某个属性是否存在
getPropertyAsClass(): 将属性解析为类
String[] getActiveProfiles(): 返回激活profile名称的数组;
String[] getDefaultProfiles(): 返回默认profile名称的数组;
boolean acceptsProfiles(String... profiles): 如果environment支持给定profile的话,就返回true。
属性占位符:"${...}"
可用在XML文件中
自动装配时,使用@Value("${some.property}")注解,并需要配置一个PropertySourcesPlaceholderConfigurer bean
Spring表达式语言(SpEL): "#{...}"
例如: "#{T(System).currentTimeMillis()}": T()表达式会将java.lang.System视为Java中对应的类型
@Value("#{some.property}")
@Value("#{systemProperties['some.property']}")
- [ ] TODO
Spring in Action学习笔记(1)的更多相关文章
- spring in action学习笔记十五:配置DispatcherServlet和ContextLoaderListener的几种方式。
在spring in action中论述了:DispatcherServlet和ContextLoaderListener的关系,简言之就是DispatcherServlet是用于加载web层的组件的 ...
- spring in action 学习笔记十四:用纯注解的方式实现spring mvc
在讲用纯注解的方式实现springmvc之前先介绍一个类:AbstractAnnotationDispatcherServletInitializer.这个类的作用是:任何一个类继承AbstractA ...
- spring in action学习笔记一:DI(Dependency Injection)依赖注入之CI(Constructor Injection)构造器注入
一:这里先说一下DI(Dependency Injection)依赖注入有种表现形式:一种是CI(Constructor Injection)构造方法注入,另一种是SI(Set Injection) ...
- Spring in Action 学习笔记三-AOP
面向切面的Spring 2015年10月9日 11:30 屏幕剪辑的捕获时间: 2015-10-9 14:30 屏幕剪辑的捕获时间: 2015-10-9 ...
- Spring in Action 学习笔记二-DI
装配bean 2015年10月9日 9:49 Sprng中,对象无需自己负责查找或创建其关联的其他对象.相关,容器负责吧需要相互协作的对象引用赋予各个对象. 创建应用对象之间协 ...
- Spring in Action 学习笔记一
Spring 核心 Spring的主要特性仅仅是 依赖注入DI和面向切面编程AOP JavaBean 1996.12 Javav 规范针对Java定义了软件组件模型,是简单的J ...
- spring in action学习笔记十六:配置数据源的几种方式
第一种方式:JNDI的方式. 用xml配置的方式的代码如下: 1 <jee:jndi-lookup jndi-name="/jdbc/spittrDS" resource-r ...
- spring in action 学习笔记九:如何证明在scope为prototype时每次创建的对象不同。
spring 中scope的值有四个:分别是:singleton.prototype.session.request.其中session和request是在web应用中的. 下面证明当scope为pr ...
- spring in action学习笔记七:@Conditional注解的用法
@Profile注解是@Conditional注解的一个例子.即@Profile也是用@Conditional注解来实现的. 必须让条件实现Condition这个接口. 下面的案例讲如果环境中有mag ...
- spring in action 学习笔记五:@Autowired这个注解如何理解
@Autowired这个注解的意思就是自动装配.他把一个bean对象自动装配到另一个对象中.下面的案例证明了spring的自动装配. 定义一个Sixi类.代码如下: package com.qls.a ...
随机推荐
- Integer 如何实现节约内存和提升性能的?
在Java5中,为Integer的操作引入了一个新的特性,用来节省内存和提高性能.整型对象在内部实现中通过使用相同的对象引用实现了缓存和重用. 上面的规则默认适用于整数区间 -128 到 +127(这 ...
- noip模拟6[辣鸡·模板·大佬·宝藏]
这怕不是学长出的题吧 这题就很迷 这第一题吧,正解竟然是O(n2)的,我这是快气死了,考场上一直觉得aaaaa n2过不了过不了, 我就去枚举边了,然后调了两个小时,愣是没调出来,然后交了个暴力,就走 ...
- Manacher(马拉车)————O(n)回文子串
Manacher 一.背景 1975年,Manacher发明了Manacher算法(中文名:马拉车算法),是一个可以在O(n)的复杂度中返回字符串s中最长回文子串长度的算法,十分巧妙. 让我们举个栗子 ...
- url参数接收的一些安全应用场景
越权漏洞,从原来的修改id越权到后面的自己加参数,减参数越权,到现在的加特殊字符.攻击手段在进步: 以php和java为例,聊聊参数接收的最大接受能力,可以插入哪些脏数据? demo1.php: &l ...
- 『心善渊』Selenium3.0基础 — 8、使用CSS选择器定位元素
目录 1.CSS选择器介绍 2.CSS选择器定位语法 3.Selenium中使用CSS选择器定位元素 (1)通过属性定位元素 (2)通过标签定位元素 (3)通过层级关系定位元素 (4)通过索引定位元素 ...
- QTreeView 使用 QStandardItemModel
QTreeView 使用 QStandardItemModel @ 目录 QTreeView 使用 QStandardItemModel 前言 一.直接上图 二.添加同级结点项 1.思路 2.实现 二 ...
- 9.5、zabbix高级操作(1)
在zabbix-web中删除之前所有监控的主机: 1.zabbix自动发现配置: zabbix-server通过扫描指定范围的ip地址发现zabbix-agent并自动添加监控主机,适用于zabbix ...
- 关于 Index '8' specified is out of bounds.
报类似这样的错误暂时我只发现了两个原因: 1, 数组超出了界线,这个自己多多注意,加判断,在循环的时候看看是不是有结束条件 2, 你需要提交的网页不存在.有可能是因为你没有这个文件.可能是你的文件名错 ...
- Linux:Ubuntu银河麒麟防火墙操作
查看防火墙状态 #防火墙状态 sudo ufw status inactive状态是防火墙 关闭 状态 active状态是防火墙 开启 状态 开启防火墙 #开启防火墙 sudo ufw enable ...
- 消息队列——kafka
原文:再过半小时,你就能明白kafka的工作原理了 会出现什么情况呢? 1.为了这个女朋友,我请假回去拿(老板不批). 2.小哥一直在你楼下等(小哥还有其他的快递要送). 3.周末再送(显然等不及). ...