zoukankan      html  css  js  c++  java
  • SpringInAction4笔记——装配

    重点:常用的上下文环境

    AnnotationConfigApplicationContext

    ClassPathXmlApplicationContext

    FileSystemXmlApplicationContext


    AnnotationConfigWebApplicationContext

    XmlWebApplicationContext

     

    1.常用的注解

     

    显示装配的@Bean,需要和@Configuration配合使用

    1、用到任意方法,告诉Spring这个方法将会返回一个对象,该对象要注册成为Spring应用上下文中的bean,默认情况下,bean的ID就是@Bean注解的方法名。

    2、Spring会拦截所有对该方法的调用,并直接返回该方法所创建的bean

     

    java配置和xml配置 混合装配

     

    java的某个配置类中:
    
    @Import(xxxConfig.class)
    @ImportResource("classpath:xxxConfig.xml")
    
    
    XML的某个配置文件中:
    <bean class="xxxConfig.class">
    <import resource="xxxConfig.xml">
    

     

    自动装配的使用流程:

    1、@ContextConfiguration(classes=CDPlayerConfig.class)

    2、@ComponentScan//CDPlayerConfig上面,表示扫描组件,可以指定范围,不指定范围则扫描配置类所在的基础包

    3、@Component //被注入的类上使用

    4、@Atuowired //注入时使用

     

    自动装配的歧义性

    @Autowired是spring的元注解,可以用java的@Inject替代,先按类型找,如果找不到或者有多个,就按照name找,(扫描时默认是把类名第一个字母小写作为name)

    可以用@Qualifier来指定name,或者把变量名改成扫描时生产的name

    解决自动装配的歧义性,可以通过

    @Qualifier 推荐用这个,设置一个代表性的名字

    @Primary 

     

     

    环境与profile

    @Profile("dev"),可以用到类上和方法上,可以使用"!",该注解是使用@Conditional注解实现的。

    @ActiveProfiles("dev","!test")

    bean的作用域@Scope

    单例(Singleton):在整个应用中,只创建一个实例

    原型(Prototype):每次注入或者通过Spring应用上下文获取时,都会创建一个新的bean实例

    会话(Session):在Web应用中,为每个会话创建一个bean实例

    请求(Request):在Web应用中,为每个请求创建一个bean实例

    对于Session和Request作用域,需要设置proxyMode,因为该作用域的对象注入单例时,注入的是一个代理,运行时再委托给相应的实例。

    如果Session作用域的是一个借口的话,可以用proxyMode = ScopedProxyMOde.INTERFACES,

    如果是一个具体的类的话,需要设置为proxyMode = ScopedProxyMOde.TARGET_CLASS。

    注入外部的值

    @PropertySource("classpath:/com/soundsystem/app.properties")

    @Autowired

    Environment env

    解析属性占位符${...}

    @Value("${disc.title}") String title;

    SpEL表达式#{...},支持类型安全运输符 "?."

    访问类作用域的方法和常量,需要依赖T关键字,比如#{T(System).currentTimeMillis()}

    使用@Value注解来调用${...}和#{...}

    @Value("#{systemPrpperties['disc.title']}") String title

     

     

     

     

     

     

     

     

     

     

      @Autowired

      @Qualifier("sgtPeppers" )

      private CompactDisc sgtPeppers;

     

    @Component

     

     

    @Configuration

     

    @RunWith(SpringJUnit4ClassRunner.class)

    @ContextConfiguration(classes=CDPlayerConfig.class)

     

     

    xml用构造器注入时,

    <constructor-arg value="The Beatles" />

    或者用c语法

     

     

    <bean id="compactDisc" class="soundsystem.BlankDisc"

     

            c:_0="Sgt. Pepper's Lonely Hearts Club Band" 

     

            c:_1="The Beatles" />

     

            

     

      <bean id="cdPlayer" class="soundsystem.CDPlayer"

     

            c:_-ref="compactDisc" />

     

     

    注入属性时:

    <property name="artist" value="The Beatles" />

    或者用p语法

     <bean id="compactDisc"

            class="soundsystem.properties.BlankDisc"

            p:title="Sgt. Pepper's Lonely Hearts Club Band"

            p:artist="The Beatles"

            p:tracks-ref="trackList" />

     

    <util:list>等来将bean中的复杂的参数移到外面去,保持xml代码的易读性

     

     

    xml中引用其他xml文件

     

    <import resource="cd-config.xml">

     

    可以使用<bean class="xxx.xx">把javaConfig类导入到XML文件中

     

    javaConfig中引用其他配置

     

     

    @Configuration

     

    @Import(CDPlayerConfig.class)

     

    @ImportResource("classpath:cd-config.xml")

     

    public class SoundSystemConfig {

     

     

     

    }

     

     

     

    无论怎么引用,只要在root配置中启用组件扫描即可

    比如@ComponentScan和<context:component-scan >

     

    配置多个可互相替代的bean时,比如DataSource

    java配置:

     

     

    @Profile("dev")

    xml配置

    <beans profile="dev">

     

     

    使用时通过@ActiveProfiles来选择用哪个

     

    @ActiveProfiles("prod")

     

     

    也可以在

    在web.xml中,配置

    <context-param>

    <param-name></param-name>

    <param-value></param-value>

    </context-param>

     

    按条件注入Bean

     

     

    1、@Bean

    @Conditional(MagicExistsCondition.class)

     

     

     

     

    2、public class MagicExistsCondition implements Condition

     

     

    Bean的作用域

     单例 Singleton

    原型 Prototype

    会话 Session

    请求 Request

     

     

    @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)

     

     

     

    <bean class="com.myapp.Notepad" scope="prototype" />

     

     

    会话 Session和请求 Request需要设置代理proxyMode,

    如果是xml配置,bean中加入<aop:scoped-proxy>

     

     

    生命周期 

    1.实例化

    2.为属性赋值

    3.BeanNameAware接口

    4.BeanFactoryAware接口

    5.ApplicationContextAware接口

    6.BeanPostProcessor接口

    7.InitializingBean接口

    8.DisposableBean接口

     

     

     


    引入properties文件

     

     

     

    <context:property-placeholder location="classpath:system.properties" />

     

     

     

    java配置

     

    @PropertySource("classpath:/com/soundsystem/app.properties")

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

  • 相关阅读:
    java 23种设计模式及具体例子 收藏有时间慢慢看
    java中的内存一般分成几部分?
    深入浅出Java垃圾回收机制
    HashMap、HashTable、LinkedHashMap和TreeMap用法和区别
    java 序列化与反序列化
    JAVA中int、String的类型相互转换
    java IO和NIO 的区别
    数据库设计
    服务器硬件优化
    系统配置优化
  • 原文地址:https://www.cnblogs.com/lakeslove/p/7297903.html
Copyright © 2011-2022 走看看