依赖注入

基于构造函数的依赖注入:

   <bean id="textEditor" class="com.tutorialspoint.TextEditor">

      <constructor-arg ref="spellChecker"/>

   </bean>

 

   <bean id="spellChecker" class="com.tutorialspoint.SpellChecker">

   </bean>

多个构造函数参数,可以以顺序、类型、显示指明:

   <bean id="foo" class="x.y.Foo">

      <constructor-arg ref="bar"/>

      <constructor-arg ref="baz"/>

   </bean>

   <bean id="exampleBean" class="examples.ExampleBean">

      <constructor-arg type="int" value="2001"/>

      <constructor-arg type="java.lang.String" value="Zara"/>

   </bean>

   <bean id="exampleBean" class="examples.ExampleBean">

      <constructor-arg index="0" value="2001"/>

      <constructor-arg index="1" value="Zara"/>

   </bean>

基于设值函数的依赖注入:

   <bean id="textEditor" class="com.tutorialspoint.TextEditor">

      <property name="spellChecker" ref="spellChecker"/>

   </bean>

 

   <bean id="spellChecker" class="com.tutorialspoint.SpellChecker">

   </bean>

注入内部 Beans:

   <bean id="textEditor" class="com.tutorialspoint.TextEditor">

      <property name="spellChecker">

         <bean id="spellChecker" class="com.tutorialspoint.SpellChecker"/>

       </property>

   </bean>

 

注入集合:

      <!-- results in a setAddressList(java.util.List) call -->

      <property name="addressList">

         <list>

            <value>INDIA</value>

            <value>Pakistan</value>

            <ref bean="address1"/>

            <ref bean="address2"/>

         </list>

      </property>

 

      <!-- results in a setAddressSet(java.util.Set) call -->

      <property name="addressSet">

         <set>

            <value>INDIA</value>

            <value>Pakistan</value>

            <ref bean="address1"/>

            <ref bean="address2"/>

        </set>

      </property>

 

      <!-- results in a setAddressMap(java.util.Map) call -->

      <property name="addressMap">

         <map>

            <entry key="1" value="INDIA"/>

            <entry key="2" value="Pakistan"/>

            <entry key ="two" value-ref="address1"/>

            <entry key ="three" value-ref="address2"/>

         </map>

      </property>

 

      <!-- results in a setAddressProp(java.util.Properties) call -->

      <property name="addressProp">

         <props>

            <prop key="one">INDIA</prop>

            <prop key="two">Pakistan</prop>

            <prop key="three">USA</prop>

            <prop key="four">USA</prop>

         </props>

      </property>

注入null

<property name="email"><null/></property>

 

自动装配:

   <bean id="textEditor" class="com.tutorialspoint.TextEditor"

      autowire="byName/byType/constructor">

   </bean>

 

基于注解的配置:

<context:annotation-config/>

@Required 注释应用于 bean 属性的 setter 方法,它表明受影响的 bean 属性在配置时必须放在 XML 配置文件中

   @Required

   public void setAge(Integer age) {

      this.age = age;

   }

Setter 方法中的 @Autowired

   @Autowired

   public void setSpellChecker( SpellChecker spellChecker ){

      this.spellChecker = spellChecker;

   }

属性中的 @Autowired

   @Autowired

   private SpellChecker spellChecker;

构造函数中的 @Autowired

   @Autowired

   public TextEditor(SpellChecker spellChecker){

      System.out.println("Inside TextEditor constructor." );

      this.spellChecker = spellChecker;

   }

@Autowired 的(required=false)选项

   @Autowired(required=false)

   public void setAge(Integer age) {

      this.age = age;

   } 

@Qualifier 注释,指定相同类型的 bean

   @Autowired

   @Qualifier("student1")

   private Student student;

@PostConstruct @PreDestroy 注释

@Resource 注释

   @Resource(name= "spellChecker")

   public void setSpellChecker( SpellChecker spellChecker ){

      this.spellChecker = spellChecker;

   }

 

基于 Java 的配置

@Configuration 注解表示这个类可以使用 Spring IoC 容器作为 bean 定义的来源。

@Bean 注解告诉 Spring,方法将返回一个对象。方法名称作为 bean ID

@import 注解允许从另一个配置类中加载 @Bean 定义。

使用 AnnotationConfigApplicationContext 来加载并把他们提供给 Spring 容器

@Configuration

@Import(ConfigA.class)

public class BeanConfig {

@Bean(initMethod = "init", destroyMethod = "cleanup" )

@Scope("prototype")

public News news()

{

return new News();

}

}

----

ApplicationContext ctx = new AnnotationConfigApplicationContext(BeanConfig.class);

News obj = ctx.getBean(News.class);

obj.setTitle("BeanConfig World!");

System.out.println(obj.getTitle());

 

监听上下文事件:

1、事件监听器

public class CStartEventHandler implements ApplicationListener<ContextStartedEvent> {

@Override

public void onApplicationEvent(ContextStartedEvent arg0) {

System.out.println("ctx start!");

}

}

----

2、配置事件监听器和发布者

<bean id="cStartEventHandler"

         class="com.huawei.TestMavenProj.spring.CStartEventHandler"/>

<bean id="customEventHandler"

      class="com.tutorialspoint.CustomEventHandler"/>

<bean id="customEventPublisher"

      class="com.tutorialspoint.CustomEventPublisher"/>

----

3、触发事件

ConfigurableApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");

context.start();

context.stop();

----

1、自定义事件

public class CustomEvent extends ApplicationEvent {

public CustomEvent(Object source) {

super(source);

}

----

2、自定义事件发布者

public class CustomEventPublisher

   implements ApplicationEventPublisherAware {

   private ApplicationEventPublisher publisher;

   public void setApplicationEventPublisher

              (ApplicationEventPublisher publisher){

      this.publisher = publisher;

   }

   public void publish() {

      CustomEvent ce = new CustomEvent(this);

      publisher.publishEvent(ce);

   }

}

----

3、触发事件

CustomEventPublisher cvp =

(CustomEventPublisher) context.getBean("customEventPublisher");

cvp.publish();  

posted @ 2018-04-19 19:55  AaronCnblogs  阅读(119)  评论(0)    收藏  举报