public interface HelloApi {
public String helloSpring3(int a);
}
public class HelloImpl implements HelloApi{
public String helloSpring3(int a){
System.out.println("hello Spring3==="+a);
return "Ok,a="+a;
}
}
3:建议使用Spring3的Schema版本,示例如下:
………………………
编写客户端如下:
java代码:package cn.javass.Spring3.hello;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Client {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext(
new String[] {"applicationContext.xml"});
HelloApi api = (HelloApi)context.getBean("helloBean");
String s = api.helloSpring3(3);
System.out.println("the s="+s);
}
}
Resource resource = new FileSystemResource("beans.xml");
BeanFactory factory = new XmlBeanFactory(resource);
ClassPathResource resource = new ClassPathResource("beans.xml");
BeanFactory factory = new XmlBeanFactory(resource);
ApplicationContext context = new ClassPathXmlApplicationContext(
new String[] {"applicationContext.xml", "applicationContext-part2.xml"});
// of course, an ApplicationContext is just a BeanFactory
BeanFactory factory = (BeanFactory) context;
配置文件中常见的配置内容
在IoC容器内部,bean的定义由BeanDefinition 对象来表示,该定义将包含以下信息:
1:全限定类名:这通常就是已定义bean的实际实现类。如果通过调用static factory方法来实例化bean,而不是使用常规的构造器,那么类名称实际上就是工厂类的类名。
2:bean行为的定义,即创建模式(prototype还是singleton)、自动装配模式、依赖检查模式、初始化以及销毁方法。这些定义将决定bean在容器中的行为。
3:用于创建bean实例的构造器参数及属性值。比如使用bean来定义连接池,可以通过属性或者构造参数指定连接数,以及连接池大小限制等。
4:bean之间的关系,即协作 (或者称依赖)。
Bean的命名
每个bean都有一个或多个id(或称之为标识符或名称,在术语上可以理解成一回事),这些id在当前IoC容器中必须唯一。
当然也可以为每个bean定义一个name,但是并不是必须的,如果没有指定,那么容器将为其生成一个惟一的name。对于不指定name属性的原因我们会在后面介绍(比如内部bean就不需要)。
Bean命名的约定
bean的命名采用标准的Java命名约定,即小写字母开头,首字母大写间隔的命名方式。如accountManager、 accountService等等。
对bean采用统一的命名约定将会使配置更加简单易懂。而且在使用Spring AOP,这种简单的命名方式将会令你受益匪浅。
Bean的别名
一个Bean要提供多个名称,可以通过alias属性来加以指定 ,示例如下:
容器如何实例化Bean
当采用XML描述配置元数据时,将通过元素的class属性来指定实例化对象的类型。class属性主要有两种用途:在大多数情况下,容器将直接通过 反射调 用指定类的构造器来创建bean(这有点等类似于在Java代码中使用new操作符);在极少数情况下,容器将调用类的静态工厂方法来创建bean实例,class属性将用来指定实际具有静态工厂方法的类(至于调用静态工厂方法创建的对象类型是当前class还是其他的class则无关紧要)。
用构造器来实例化Bean ,前面的实例就是
使用静态工厂方法实例化
采用静态工厂方法创建bean时,除了需要指定class属性外,还需要通过factory-method属性来指定创建bean实例的工厂方法,示例如下:
class="examples.ExampleBean2"
factory-method="createInstance"/>
使用实例工厂方法实例化
使用此机制,class属性必须为空,而factory-bean属性必须指定为当前(或其祖先)容器中包含工厂方法的bean的名称,而该工厂bean的工厂方法本身必须通过factory-method属性来设定,并且这个方法不能是静态的,示例如下:
使用容器
从本质上讲,BeanFactory仅仅只是一个维护bean定义以及相互依赖关系的高级工厂接口。使用getBean(String)方法就可以取得bean的实例;BeanFactory提供的方法极其简单。n依赖注入(DI) 背后的基本原理
是对象之间的依赖关系(即一起工作的其它对象)只会通过以下几种方式来实现: 构造器的参数、 工厂方法的参数,或 给由构造函数或者工厂方法创建的对象设 置属性。
因此,容器的工作就是创建bean时注入那些依赖关系。相对于由bean自己来控制其实例化、直接在构造器中指定依赖关系或则类似服务定位器(Service Locator)模式这3种自主控制依赖关系注入的方法来说,控制从根本上发生了倒转,这也正是控制反转IoC名字的由来。
应用依赖注入(DI)的好处、
应用DI原则后,代码将更加清晰。而且当bean自己不再担心对象之间的依赖关系(以及在何时何地指定这种依赖关系和依赖的实际类是什么)之后,实现更高层次的 松耦合将易如反掌。
依赖注入(DI)基本的实现方式
DI主要有两种注入方式,即 Setter注入和 构造器注入。
通过调用无参构造器或无参static工厂方法实例化bean之后,调用该bean的setter方法,即可实现基于setter的DI。 示例如下:
示例——Java类
java代码:public class HelloImpl implements HelloApi{
private String name = "";
public void setName(String name){
this.name = name;
}
public String helloSpring3(int a){
System.out.println("hello Spring3==="+a+",name="+name);
return "Ok,a="+a;
}
}
public class HelloImpl implements HelloApi{
private String name = "";
public HelloImpl(String name){
this.name = name;
}
public String helloSpring3(int a){
System.out.println("hello Spring3==="+a+",name="+name);
return "Ok,a="+a;
}
}
javass Spring3
构造器参数的索引
使用index属性可以显式的指定构造器参数出现顺序。例如:
java代码:
直接量(基本类型、Strings类型等)
元素通过字符串来指定属性或构造器参数的值。JavaBean属性编辑器将把字符串从java.lang.String类型转化为实际的属性或参数类型。示例:
java代码:oracle.jdbc.driver.OracleDriverjdbc:oracle:thin:@localhost:1521:orcltest
上述bean定义片段完全地等同于(在运行时)以下的片段
theTargetBean
内部Bean
所谓的内部bean(inner bean)是指在一个bean的或 元素中使用元素定义的bean。内部bean定义不需要有id或name属性,即使指定id 或 name属性值也将会被容器忽略。示例:
java代码:
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26660100/viewspace-717227/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/26660100/viewspace-717227/