3.The IoC container

http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/beans.html

The ApplicationContext is the interface for an advanced factory capable of maintaining a registry of different beans and their dependencies. Using the method T getBean(Stringname, Class<T> requiredType) you can retrieve instances of your beans.

The ApplicationContext enables you to read bean definitions and access them as follows:

1 // create and configure beans
2 ApplicationContext context =
3     new ClassPathXmlApplicationContext(new String[] {"services.xml", "daos.xml"});
4 
5 // retrieve configured instance
6 PetStoreServiceImpl service = context.getBean("petStore", PetStoreServiceImpl.class);
7 
8 // use configured instance
9 List userList service.getUsernameList();

接口ApplicationContext中还有其它的方法来取回beans实例,但是理想的情况是你的应用应该不使用它们。从而使应用不dependency on Spring APIs。For example, Spring's integration with web frameworks provides for dependency injection for various web framework classes such as controllers and JSF-managed beans.

3.3.2.2 Instantiation with a static factory method

 1 <bean id="clientService"
 2       class="examples.ClientService"
 3       factory-method="createInstance"/>
 4 
 5 public class ClientService {
 6   private static ClientService clientService = new ClientService();
 7   private ClientService() {}
 8 
 9   public static ClientService createInstance() {
10     return clientService;
11   }
12 }

3.3.2.3 Instantiation using an instance factory method

 1 <!-- the factory bean, which contains a method called createInstance() -->
 2 <bean id="serviceLocator" class="examples.DefaultServiceLocator">
 3   <!-- inject any dependencies required by this locator bean -->
 4 </bean>
 5 
 6 <!-- the bean to be created via the factory bean -->
 7 <bean id="clientService"
 8       factory-bean="serviceLocator"
 9       factory-method="createClientServiceInstance"/>
10 
11 public class DefaultServiceLocator {
12   private static ClientService clientService = new ClientServiceImpl();
13   private DefaultServiceLocator() {}
14 
15   public ClientService createClientServiceInstance() {
16     return clientService;
17   }
18 }

Dependency injection (DI)的两种方法:Constructor-based dependency injection and Setter-based dependency injection.

3.4.1.1 Constructor-based dependency injection

 1 package x.y;
 2 
 3 public class Foo {
 4 
 5   public Foo(Bar bar, Baz baz) {
 6       // ...
 7   }
 8 }
 9 
10 <beans>
11   <bean id="foo" class="x.y.Foo">
12       <constructor-arg ref="bar"/>
13       <constructor-arg ref="baz"/>
14   </bean>
15 
16   <bean id="bar" class="x.y.Bar"/>
17   <bean id="baz" class="x.y.Baz"/>
18 
19 </beans>
20 
21 //////////////////////////////////////////////////////////////////
22 package examples;
23 
24 public class ExampleBean {
25 
26   // No. of years to the calculate the Ultimate Answer
27   private int years;
28 
29   // The Answer to Life, the Universe, and Everything
30   private String ultimateAnswer;
31 
32   public ExampleBean(int years, String ultimateAnswer) {
33       this.years = years;
34       this.ultimateAnswer = ultimateAnswer;
35   }
36 }
37 
38 <bean id="exampleBean" class="examples.ExampleBean">
39 <constructor-arg type="int" value="7500000"/>
40 <constructor-arg type="java.lang.String" value="42"/>
41 </bean>
42 
43 <bean id="exampleBean" class="examples.ExampleBean">
44 <constructor-arg index="0" value="7500000"/>
45 <constructor-arg index="1" value="42"/>
46 </bean>
47 
48 <bean id="exampleBean" class="examples.ExampleBean">
49 <constructor-arg name="years" value="7500000"/>
50 <constructor-arg name="ultimateanswer" value="42"/>
51 </bean>
52 
53 package examples;
54 
55 public class ExampleBean {
56 
57   // Fields omitted
58 
59   @ConstructorProperties({"years", "ultimateAnswer"})
60   public ExampleBean(int years, String ultimateAnswer) {
61       this.years = years;
62       this.ultimateAnswer = ultimateAnswer;
63   }
64 }

3.4.1.2 Setter-based dependency injection

Spring容器验证每个bean的配置当容器被创建的时候。然而bean的属性只有bean创建时才被设置。

只有被设置为singleton-scoped并且pre-instantiated (默认)的bean才在容器被创建时被创建。否则bean直到被请求时才被创建。

Creation of a bean potentially causes a graph of beans to be created, as the bean's dependencies and its dependencies' dependencies (and so on) are created and assigned.

<bean id="lazy" class="com.foo.ExpensiveToCreateBean" lazy-init="true"/>

 

1 <beans default-lazy-init="true">
2   <!-- no beans will be pre-instantiated... -->
3 </beans>

 

 

 

 


 

 

 

 

 

 

 

 

posted @ 2012-11-08 14:53  siyed  Views(1413)  Comments(0Edit  收藏  举报