Spring基础

IoC 控制反转, 也称为DI-依赖注入

一、装配bean

推荐顺序:自动装配 -> JavaConfig装配 -> XML装配

1. 自动装配

  1. @Component 注解:表明该类会作为组件类,并告知Spring要为这个类创建bean。该bean的ID为第一个字母小写的类名;

    @ComponentScan 注解:告诉Config配置类启用组件扫描,默认扫描的基础包为该配置类相同的包以及下面的子包。

    @Autowired 注解:将bean注入对象中

    @Test 注解:测试用,单元测试junit需要使用junit-4.x.jar + hamcrest-core-1.x.jar

  2. @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)的更多相关文章

  1. spring in action学习笔记十五:配置DispatcherServlet和ContextLoaderListener的几种方式。

    在spring in action中论述了:DispatcherServlet和ContextLoaderListener的关系,简言之就是DispatcherServlet是用于加载web层的组件的 ...

  2. spring in action 学习笔记十四:用纯注解的方式实现spring mvc

    在讲用纯注解的方式实现springmvc之前先介绍一个类:AbstractAnnotationDispatcherServletInitializer.这个类的作用是:任何一个类继承AbstractA ...

  3. spring in action学习笔记一:DI(Dependency Injection)依赖注入之CI(Constructor Injection)构造器注入

    一:这里先说一下DI(Dependency Injection)依赖注入有种表现形式:一种是CI(Constructor Injection)构造方法注入,另一种是SI(Set Injection) ...

  4. Spring in Action 学习笔记三-AOP

    面向切面的Spring 2015年10月9日 11:30             屏幕剪辑的捕获时间: 2015-10-9 14:30             屏幕剪辑的捕获时间: 2015-10-9 ...

  5. Spring in Action 学习笔记二-DI

    装配bean 2015年10月9日 9:49             Sprng中,对象无需自己负责查找或创建其关联的其他对象.相关,容器负责吧需要相互协作的对象引用赋予各个对象. 创建应用对象之间协 ...

  6. Spring in Action 学习笔记一

    Spring 核心       Spring的主要特性仅仅是 依赖注入DI和面向切面编程AOP       JavaBean 1996.12 Javav 规范针对Java定义了软件组件模型,是简单的J ...

  7. spring in action学习笔记十六:配置数据源的几种方式

    第一种方式:JNDI的方式. 用xml配置的方式的代码如下: 1 <jee:jndi-lookup jndi-name="/jdbc/spittrDS" resource-r ...

  8. spring in action 学习笔记九:如何证明在scope为prototype时每次创建的对象不同。

    spring 中scope的值有四个:分别是:singleton.prototype.session.request.其中session和request是在web应用中的. 下面证明当scope为pr ...

  9. spring in action学习笔记七:@Conditional注解的用法

    @Profile注解是@Conditional注解的一个例子.即@Profile也是用@Conditional注解来实现的. 必须让条件实现Condition这个接口. 下面的案例讲如果环境中有mag ...

  10. spring in action 学习笔记五:@Autowired这个注解如何理解

    @Autowired这个注解的意思就是自动装配.他把一个bean对象自动装配到另一个对象中.下面的案例证明了spring的自动装配. 定义一个Sixi类.代码如下: package com.qls.a ...

随机推荐

  1. 身为一枚优秀的程序员必备的基于Redis的分布式锁和Redlock算法

    1 前言 今天开始来和大家一起学习一下Redis实际应用篇,会写几个Redis的常见应用. 在我看来Redis最为典型的应用就是作为分布式缓存系统,其他的一些应用本质上并不是杀手锏功能,是基于Redi ...

  2. 使⽤Swagger2构建强⼤的RESTful API⽂档

    使⽤Swagger2构建强⼤的RESTful API⽂档 导语: 由于Spring Boot能够快速开发.便捷部署等特性,相信有很⼤⼀部分Spring Boot的⽤户会⽤来构建RESTful API. ...

  3. Redisson 分布式锁源码 01:可重入锁加锁

    前言 相信小伙伴都是使用分布式服务,那一定绕不开分布式服务中数据并发更新问题! 单系统很容易想到 Java 的各种锁,像 synchronize.ReentrantLock 等等等,那分布式系统如何处 ...

  4. Redis的数据类型以及应用场景

    1. Redis的作用 1.1 Redis可以做什么 1.缓存:缓存机制几乎在所有的大型网站都有使用,合理地使用缓存不仅可以加快数据的访问速度,而且能够有效地降低后端数据源的压力.Redis提供了键值 ...

  5. 快速了解ARP

    目录 前言 一.MAC 1.MAC地址三种帧 二.ARP 1.五种ARP 三.ARP老化 四.什么时候会发送免费ARP 五.代理ARP 六.ARP欺骗 总结 前言 分别介绍MAC地址和五种ARP报文 ...

  6. Vsftpd虚拟用户登陆配置(Centos7)

    1 安装Vsftpd服务 # yum install vsftpd -y vsftp虚拟用户是为了保证FTP服务器的安全性,由vsftpd服务器提供的非系统用户账号, 相对于FTP的本地用户来说,虚拟 ...

  7. 一、.Net Core 依赖注入详解及Autofac使用

    .NET中的依赖注入实际上帮助我们解耦了我们的代码,是控制反转和依赖反转原则的具体实现. .Net Core的依赖注入的好处: 1. application 更稳定,容易维护和演化: 2. 实现细节的 ...

  8. 【luogu P3807】【模板】卢卡斯定理/Lucas 定理(含 Lucas 定理证明)

    [模板]卢卡斯定理/Lucas 定理 题目链接:luogu P3807 题目大意 求 C(n,n+m)%p 的值. p 保证是质数. 思路 Lucas 定理内容 对于非负整数 \(n\),\(m\), ...

  9. Samba常见漏洞利用

    Samba简介 Samba是linux和unix系统上实现smb协议的一个免费软件,由服务器及客户端程序构成,Samba是面向Linux和Unix环境的Windows互操作性套件.它适用于在可能包括L ...

  10. AcWing 1289. 序列的第k个数

    BSNY 在学等差数列和等比数列,当已知前三项时,就可以知道是等差数列还是等比数列. 现在给你 整数 序列的前三项,这个序列要么是等差序列,要么是等比序列,你能求出第k项的值吗. 如果第k项的值太大, ...