一、概述

    Spring框架是以 简化Java EE应用程序的开发
为指标而创造的。Spring能够完毕广大职能,不过那么些意义的底层都凭借于它的多少个宗旨性格,也正是借助注入和面向切面编程。差不多Spring所做的其余业务都得以追溯到下述的一条或多条政策:

听闻POJO的轻量级和微小侵入性编制程序;
透过重视注入和面向接口实现松耦合;
根据切面和规矩展开申明式编制程序;
因而切面和模板缩小样板式代码。 

    Spring的七个着力愿景:

选拔DI来完毕低耦合
应用AOP切面达成高内聚
采纳模板搞定样板式代码,比如jdbcTemplate

二、Bean

   
容器是Spring框架的骨干。Spring容器使用DI管理结合应用的机件(Bean),它会创设互相合营的零件之间的关系。毫无疑问,那个指标更简明干净,更便于精通和重用,更便于单元测试。

    Spring为各种Bean定义了多样功效域,暗中同意都以以单例的形式开创的:

单例(Singleton):在总体应用中,只成立bean的1个实例。
原型(Prototype):每一遍注入可能通过Spring应用上下文获取的时候,都会创建二个新的bean实例。
对话(Session):在Web应用中,为每一种会话创立二个bean实例。
呼吁(凯雷德quest):在Web应用中,为种种请求创造2个bean实例。

    Bean的生命周期:

XML 1

   
 Spring自带了七连串型的上下文(适用于在平凡类中运用Spring的上下文加载要求的Bean):

AnnotationConfigApplicationContext:从2个大概八个的Java配置类中加载Spring的使用上下文

XML 2XML 3

ApplicationContext applicationContext = new AnnotationConfigApplicationContext(JavaConfig.class);

View Code

AnnotationConfigWebApplicationContext:从多少个或四个基于Java的布局类中加载Spring
Web应用上下文。
ClassPathXmlApplicationContext:从类路径下的三个或多个XML配置文件中加载上下文定义,把利用上下文的概念文件作为类能源。

XML 4XML 5

ApplicationContext applicationContext= new ClassPathXmlApplicationContext("applicationContext.xml");

View Code

FileSystemXmlapplicationcontext:从文件系统下的三个或八个XML配置文件中加载上下文定义。
XmlWebApplicationContext:从Web应用下的一个或四个XML配置文件中加载上下文定义。

叁 、信赖注入

1、@Component 申明该类会作为组件类,并告诉Spring
要为这么些类成立bean(这些bean的ID暗中同意取名类名的首字母小写)。然而组件扫描暗许是不启用的。我们还亟需出示配置一下Spring,从而命令她去寻找带有@Component(类似的还有@Repository
@service
@controller)表明的类,并为他创办bean。有三种形式来布署Spring创制Bena:

*
自动化装配的艺术:① 、建三个配置类。@Configuration
表明那个类是1个配备类
加上@ComponentScan(basePackages={“包名1″,”包名2”} 只怕basePackageClasses={包1的某部Class,包2的某部Class})
会扫描和配备类相同的包,以及这一个包下的装有子包。

                                  二 、Spring XML配置形式:
<context:component-scan base-package=””/>

* 在JavaConfig中举办突显配置(适用于第一方的类库组件装配到温馨行使中)  

XML 6XML 7

@Configuration
public class JavaConfig {



    @Bean(name = "base64Util")
    public Base64Util getBase64Util(){
        return new Base64Util();
    }

    @Bean(name = "base64UtilExpand") //这种显示配置默认的Bean名是方法名。所以最好显示配置一下
    public Base64UtilExpand getBase64UtilExpand(){
        //对于这种创建的bean需要引用其他的bean。Spring是这样处理的:当引用到还没创建的bean的时候,Spring会拦截下这个引用,等到引用的bean的创建完成。已保证Spring bean的单例模式.
        return new Base64UtilExpand(getBase64Util());
    }

    @Bean(name = "base64UtilExpand")
    public Base64UtilExpand getBase64UtilExpand(Base64Util base64Util){
        return new Base64UtilExpand(base64Util);
    }
}

View Code

* 在XML中展开始展览示配置,最古老的措施,一般很少用,有三种方法注入,构造器注入和set注入:

XML 8XML 9

    <!--构造器注入-->
    <bean id="cDPlayer" class="com.CDPlayer">
        <constructor-arg ref="compactDisc">
    </bean>
    <bean id="cDPlayer" class="com.CDPlayer">
        <constructor-arg value="compactDisc">
    </bean>
    <bean id="cDPlayer" class="com.CDPlayer">
        <constructor-arg>
            <list>
                <value></value>
            </list>
        </constructor-arg>
    </bean>

    <!--setter注入-->
    <bean id="cDPlayer" class="com.CDPlayer">
        <property name="compactDisc" ref="compactDisc">
    </bean>
    <bean id="cDPlayer" class="com.CDPlayer">
        <property name="compactDisc" value="compactDisc"><!--装配字面量:-->
    </bean>
    装配集合
    <bean id="cDPlayer" class="com.CDPlayer">
        <property name="compactDisc" value="compactDisc">
        <property name="">
            <list>
                <value></value><!--装配集合-->
            </list>
        </property>
    </bean>

View Code

2、@scope
钦命bean创立时的成效域,Spring默许成立单例形式的bean。但也有与众差异的动静,那里必要注解的是假若某些类注入了Session
和 Request 作用域的Bean,因为这几个Bean是在用户请求的时候发生的,在Spring
运维起来的时候并不设有。那里Spring是那样处理的:注入给对应Bean的3个代理,而当用户请求爆发session
可能 request 功效域Bean的时候,由这些代理连接到对应的Bean处理请求…

XML 10

 

原型:@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)

会话:(接口)@Scope(value =
WebApplicationContext.SCOPE_SESSION,proxyMode =
ScopedProxyMode.INTERFACES)

          (具体类)@Scope(value =
WebApplicationContext.SCOPE_SESSION,proxyMode =
ScopedProxyMode.TARGET_CLASS)

               当然也得以在XML中计划:

XML 11XML 12

    <bean id="shoppingCart2" class="com.entity.ShoppingCart2" scope="session">
        <aop:scoped-proxy proxy-target-class="false"/>
    </bean>

View Code

3、限定符(用的较少)

 @Profile
决定哪些bean能够被激活。供给注意的是没有点名profile的bean始终都会被创设,与激活哪个profile没有涉嫌。

 @Conditional中给定了3个Class,那个Class 达成了Codition
接口的matches 方法,该措施重返true 则生成bean,不然不转移。

 @primary
常见的情景是3个接口仅有1个落到实处类,所以采纳@Autowire的后,Spring能够走到相应的落成类。借使一个接口有七个落实类呢?@Component
和 @primary 同时接纳,标注哪个实现类优先被采用。

 @Qualifier 使用@primary
依然无法担保哪个bean被增选,因为能够在八个落到实处类上行使@primary。所以能够在落实类用@Qualifter(“bean”)名内定bean的名字。并在@Autowire
注入接口的时候是应用Qualifier
钦命实现类的bean名。当然,也得以用@Resource(name=” “)钦命类的名目。

4、读取 properties 文件

(1) @PropertySource
会引用叁个类路径上的properties的文书,并行使Environment类获取properties的变量值。例如:@PropertySource(“classpath:mongo.properties”)

XML 13XML 14

@Configuration
@PropertySource("classpath:mongo.properties")
public class JavaConfig {

    @Bean(name = "mongoUtil")
    public MongoUtil getMongoUtil(Environment env){
        return new MongoUtil(env.getProperty("mongo.host"),
                env.getProperty("mongo.port"),
                env.getProperty("mongo.database"),
                env.getProperty("mongo.username"),
                env.getProperty("mongo.password"));
    }
}

View Code

XML 15

(2) 占位符

     Spring
中占位符的款型是运用${}的方法。在代码文件中大家得以选用@Value诠释将配备文件的值注入到变量中。为了采用占位符,大家必须配备三个PropertySourcesPlaceholderConfigurer
的类,已变更相关的bean,或许经过XML配置让Spring为大家自动生成:

XML 16XML 17

@Configuration
@PropertySource("classpath:mongo.properties")
public class JavaConfig {

    @Bean(name = "propertySourcesPlaceholderConfigurer")
    public PropertySourcesPlaceholderConfigurer getPropertySourcesPlaceholderConfigurer(){
        return new PropertySourcesPlaceholderConfigurer();
    }
}

View Code

或者:

XML 18XML 19

    <!--提供读取配置文件可以使用Spring占位符${}-->
    <context:property-placeholder location="classpath:mongo.properties" file-encoding="utf-8" />

View Code

用法如下:

XML 20XML 21

@RunWith(SpringJUnit4ClassRunner.class)
//@ContextConfiguration(classes = JavaConfig.class)
@ContextConfiguration(locations = "classpath:applicationContext.xml")
public class Test06 {

    @Value("${mongo.host}")
    private String host;

    @Test
    public void test06(){
        System.out.println(host);
    }
}

View Code

四、Expression Language

 Spring Expression
Language,简称SpEL,是一种非常灵活的表明式语言,拥有不少表征,蕴涵:

使用bean的ID来引用bean;
调用方法和做客对象的习性;
对值实行算术、关系和逻辑运算;
正则说明式匹配;
聚拢操作。

SpEL 采用#{}的形式:

① 、代表字面值:#{3.14} #{‘Hello’} #{false}
2、引用bean、属性、方法 #{bean} #{bean.artist} #{bean.toUpperCase()}
#{bean?.toUpperCase()}(表示只要bean为null 就回来null,不调用方法)
③ 、引用有个别类 #{T{java.lang.Math}.PI}
肆 、长富表达式 #{bean.score > 1000 ? “win”:”los”} 判空 #{bean.score
?: “win”}
五 、正则表明式 #{bean.email matches ‘表达式’}
六 、总结集合 #{bean.song[4].title}
     查询运算符(.?)  #{bean.songs.?[artist eq ‘hello’]}
     匹配第一个 (.^)  #{bean.songs.^[artist eq ‘hello’]}
     匹配最后一个 (.$) : 

                                #{bean.songs.$[artist eq ‘hello’]}   
                      

*     *投影运算符 (.!)  #{bean.songs.![title]}

XML 22XML 23

<bean id="carl" class="com.springinaction.springidol.Instrumentalist">
    <property name="song" value="#{kenny.song}" />
</bean>

View Code

XML 24XML 25

public static class FieldValueTestBean {
    @Value("#{ systemProperties['user.region'] }")
    private String defaultLocale;
    public void setDefaultLocale(String defaultLocale) {
        this.defaultLocale = defaultLocale;
    }
    public String getDefaultLocale() {
        return this.defaultLocale;
    }
}

View Code

Spring为SpEL创制了三种新鲜的挑三拣四属特性局:systemEnvironment和systemProperties. 
systemEnvironment包罗了应用程序所在机器上的有着环境变量。 
systemProperties包括了java应用程序运维时所设置的拥有属性。

XML 26

XML 27

五、JUnit 测试

@RunWith(SpringJUnit4ClassRunner.class)
//@ContextConfiguration(classes = JavaConfig.class) 加载配置类
@ContextConfiguration(locations = "classpath:applicationContext.xml") //加载配置文件
public class Test02 {

    @Resource(name = "iceCream")
    private Dessert dessert;

    @Test
    public void test02(){
        dessert.sys();
    }

}

 

相关文章

网站地图xml地图