spring—Bean配置
来源:互联网 发布:如何申请域名 编辑:程序博客网 时间:2024/05/16 15:32
Spring是一个开源的框架,其目标是简化java的开发。为了降低Java开发的复杂性,Spring有如下的特性:
>> 基于POJO的轻量级和最小侵入性编程
>> 通过依赖注入和面向接口编程实现松耦合
>> 基于切面和惯例进行声明式编程
>> 通过切面和模板减少样板式代码
Spring的六大模块:核心Spring容器、Spring的AOP模块、数据访问与集成、Web和远程调用以及测试模块
Spring中还有其他模块,例如Spring WebService、Spring Security、Spring Web Flow、Spring .Net等等。Spring致力于简化企业级Java开发,促进代码松耦合,成功的关键在于依赖注入和AOP切面。依赖注入和AOP是Spring中最核心的部分。
** 配置并使用第一个bean
准备一个Bean,在这个类中有name和age属性
publicclass Person {
private Stringname;
privateintage;
public Person() {}
public Person(Stringname, intage) {
this.name =name;
this.age =age;
}
public String getName() {
returnname;
}
publicvoid setName(Stringname) {
this.name =name;
}
publicint getAge() {
returnage;
}
publicvoid setAge(intage) {
this.age =age;
}
@Override
public String toString() {
return"Person [name=" +name + ", age=" + age + "]";
}
}
创建一个如下的beans.xml
xmlns全名是:xml Name Space[xml命名空间]在这个文件配置文件中如果你要加入其它的标签,在这个头部加入命名空间和对应的schema约束文件的地址即可。
Person类的Bean配置如下:
<beanid="person"class="com.wxh.blog.Person">
<propertyname="name"value="wxh"></property>
<propertyname="age"value="22"></property>
</bean>
Bean中的id是唯一标识符,class是指向要配置bean的类全名。
在这个例子中用的是setter方法注入。Property中的name一定要和class中的属性的名字一样,才能正确匹配,value就是对应的值。
使用构造器注入
<beanid="person"class="com.wxh.blog.Person">
<constructor-argname="name"value="wxh"></constructor-arg>
<constructor-argname="age"value="22"></constructor-arg>
</bean>
在<constructor-arg>还有index[代表匹配构造函数中第几个参数]、type[代表value的类型]、ref[代表对其他bean的引用]
使用bean
publicstaticvoid main(String[]args) {
ApplicationContext ac=new ClassPathXmlApplicationContext("beans-example.xml");
Person person=(Person) ac.getBean("person");
System.out.println(person.toString());
}
ApplictionContext:应用上下文接口,派生与BeanFactory,BeanFactory是Spring的核心但是功能比较单一。
ApplicationContext接口的实现类有三个:
>> ClassPathXmlApplicationContext:从类路径下的XML配置文件中加载上下文定义。
>> FileSystemXmlApplicationContext:读取文件系统下的XML配置文件并加载上下文定义。
>> XmlWebApplictionContext: 读取Web应用下的XML配置文件并装载上下文。[Web中使用]
** 引用其他bean和内部beanz注入
利用ref就可以实现引用其他的bean了
首先添加一个Car类
publicclass Car {
private Stringbrand;
privateintprice;
public Car() {}
public Car(Stringbrand,intprice) {
this.price =price;
this.brand =brand;
}
public String getBrand() {
returnbrand;
}
publicvoid setBrand(Stringbrand) {
this.brand =brand;
}
publicint getPrice() {
returnprice;
}
publicvoid setPrice(intprice) {
this.price =price;
}
@Override
public String toString() {
return"Car [brand=" +brand + ", price=" + price + "]";
}
}
配置Car的Bean
<beanid="car"class="com.wxh.blog.Car">
<constructor-argvalue="吉利"></constructor-arg>
<constructor-argvalue="120000"></constructor-arg>
</bean>
利用ref引用car的bean
<beanid="person"class="com.wxh.blog.Person">
<constructor-argname="name"value="wxh"></constructor-arg>
<constructor-argname="age"value="22"></constructor-arg>
<constructor-argname="car"ref="car"></constructor-arg>
</bean>
运行结果:Person [name=wxh, age=22, car=Car[brand=吉利, price=120000]]
内部Bean的使用如下:内部bean不能被其他bean使用所以用的不多。
<beanid="person"class="com.wxh.blog.Person">
<propertyname="name"value="wxh"></property>
<propertyname="age"value="22"></property>
<propertyname="car">
<beanclass="com.wxh.blog.Car">
<propertyname="brand"value="吉利"></property>
<propertyname="price"value="20000"></property>
</bean>
</property>
</bean>
** 利用p名称空间装配属性
先引入名称空间p,再使用
p:属性名=”值”或者 p:属性名-ref=”值”[引用]
xmlns:p=http://www.springframework.org/schema/p
<beanid="person"class="com.wxh.blog.Person"
p:name="wxh"p:age="22"p:car-ref="car"></bean>
** 集合的装配
先引入:xmlns:util="http://www.springframework.org/schema/util"
这里主要使用list、map、和props
>> list的使用
<util:list>
<beanclass="com.wxh.blog.Car">
<propertyname="brand"value="奥迪"></property>
<propertyname="price"value="320000"></property>
</bean>
<beanclass="com.wxh.blog.Car">
<propertyname="brand"value="比亚迪"></property>
<propertyname="price"value="100000"></property>
</bean>
<beanclass="com.wxh.blog.Car">
<propertyname="brand"value="吉利"></property>
<propertyname="price"value="120000"></property>
</bean>
</util:list>
>> map的使用
<util:map>
<entrykey="favorite"value="篮球"></entry>
<entrykey="motto"value="no pains, no gains"></entry>
</util:map>
>> props的使用
<props>
<propkey="user">root</prop>
<propkey="password">root</prop>
<propkey="jdbcUrl">jdbc:mysql///test</prop>
<propkey="driverClass">com.mysql.jdbc.Driver</prop>
</props>
最后说一下空值的装配,应该是这样的:<property name=”name”><null/></property>
** bean的作用域
所有的bean默认都是单例的,但是可以通过scope[作用域]来设置。
在单例模式中当xml配置文件被ApplicationContext加载后就会产生一个bean的实例,以后索取bean的实例,都是获取的同一个实例。可以把scope的值设置为prototype[原型],这个在文件被加载后就不会马上产生bean,每次取出一个bean的实例就创建一个新的。
在大多数情况下,我们只需要默认的singleton即可。
** bean的生命周期
Spring IOC容器对bean的生命周期的管理过程是:
>> 通过构造器或者工厂方法创建Bean实例
>> 设置Bean的属性
>> 调用Bean的初始化方法
>> 使用Bean
>> 关闭容器,调用Bean的销毁方法
如何使用init-method和destroy-method?
先在class中添加一个init和destroy方法
publicvoid init(){
System.out.println("init......");
}
publicvoid destroy(){
System.out.println("destroy......");
}
再在xml配置文件中配置
<beanid="person"class="com.wxh.blog.Person"init-method="init"destroy-method="destroy"p:name="wxh"p:age="22"p:car-ref="car"></bean>
** 通过autowire自动装配
通过指定autowire属性可以让容器管理JavaBean自动注入依赖的对象。这样可以大大的简化配置文件的复杂度和代码量。
autowire可选参数常用的包括:
>> No: 默认值,默认是不启动自动装配的
>> byname: 通过bean属性的名字来查找Bean依赖的对象并注入
>> byType: 通过Bean属性的类型查找Bean依赖的对象并注入
<beanid="car"class="com.wxh.blog.Car">
<constructor-argvalue="吉利"></constructor-arg>
<constructor-argvalue="120000"></constructor-arg>
</bean>
<beanid="person1"class="com.wxh.blog.Person"p:name="wxh"p:age="22"autowire="byName"></bean>
<beanid="person2"class="com.wxh.blog.Person"p:name="wxh"p:age="22"autowire="byType"></bean>
** Spring Bean之间的关系
Spring Bean之间的关系有继承[parent]和依赖[depends-on]
继承:子Bean可以继承父Bean就像Java中一样,子类的属性值可以覆盖父类。可以使用parent关键字继承。
<!-- parent bean -->
<beanid="parent"class="com.wxh.blog.Person"p:car-ref="car"></bean>
<!-- extends bean -->
<beanid="children1"class="com.wxh.blog.Person" p:name="wxh"p:age="22"parent="parent"></bean>
<beanid="children2"class="com.wxh.blog.Person" p:name="wqc"p:age="21"parent="parent"></bean>
结果:
Person [name=wxh, age=22, car=Car [brand=吉利, price=120000]]
Person [name=wqc, age=21, car=Car [brand=吉利, price=120000]]
当然父bean还可以当模板bean,只需要加上abstract=”true”就行了。
<!-- parent bean -->
<beanid="parent"p:car-ref="car"abstract="true"></bean>
<!-- extends bean -->
<beanid="children1"class="com.wxh.blog.Person" p:name="wxh"p:age="22"parent="parent"></bean>
<beanid="children2"class="com.wxh.blog.Person" p:name="wqc"p:age="21"parent="parent"></bean>
依赖:在创建bean的时候一定要依赖于其他的bean先创建才能创建。通过depends-on可以指定依赖的bean。
<beanid="person"class="com.wxh.blog.Person"p:name="wxh"p:age="22"parent="parent"depends-on="car"></bean>
** 通过工厂方法配置bean
调用静态方法创建Bean是将对象创建的过程封装到静态方法中,要声明静态方法创建Bean,需要用到factory-method,如果有参数可以用constrctor-arg元素传递参数。
先创建一个工厂类CarFactory.java
/**
* 单例模式,且线程安全
*/
publicclass CarFactory {
privateintid;
private Stringname;
private CarFactory() {}
publicstatic CarFactory getInstance(){
return creatCarFactory.carFactory;
}
privatestaticclass creatCarFactory{
privatestatic CarFactorycarFactory=new CarFactory();
}
publicint getId() {
returnid;
}
publicvoid setId(intid) {
this.id =id;
}
public String getName() {
returnname;
}
publicvoid setName(Stringname) {
this.name =name;
}
@Override
public String toString() {
return"CarFactory [id=" +id + ", name=" + name + "]";
}
}
使用factory-method指定静态的工厂方法
<beanid="carFactory"class="com.wxh.blog.CarFactory"factory-method="getInstance"></bean>
还可以用实例工厂方法,即现需要创建工厂本身,再调用工厂的实例方法来返回bean的实例。就是getInstance方法不是静态的,factory-bean指定工厂Bean,factory-method指定工厂方法。
<beanid="carFactory"class="com.wxh.blog.CarFactory"></bean>
<beanid="factroy"factory-bean="carFactory"factory-method="getInstance"></bean>
** 使用SpEL表达式装配
SpEL表达式中用#{}界定符把值装配到Bean的属性中,#{}会提示Spring这个里边是SpEL表达式。
使用字面值、通过ID应用其他Bean或者Bean的属性,方法等
<beanid="personOfSpEL"class="com.wxh.model.Person"p:id="#{1111}"p:name="#{'吴鑫晖'}"p:car="#{cars}"p:more="#{more}"></bean>
在SpEL中使用T()运算符调用类作用域的方法和常量。例如
<propertyname="id"value="#{T(java.lang.Math).random()*100}"></property>
在SpEL值执行操作
在SpEl中提供了几种运算符,在这些运算符可以用在SpEL表达式中的值上。
<constructor-argname="avgScore"
value="#{(T(java.lang.Math).random()*100+T(java.lang.Math).random()*100+T(java.lang.Math).random()*100)/3}"></constructor-arg>
- spring—Bean配置
- spring—Bean配置
- Spring装配Bean——通过配置XML装配bean
- spring—使用注解配置Bean
- spring bean的配置
- Spring Bean 配置说明
- Spring 中的 Bean 配置
- Spring Bean 配置说明
- Spring配置bean属性
- Spring Bean配置示例
- Spring Bean配置继承
- spring 配置bean
- spring FactoryBean配置Bean
- Spring之Bean配置
- Spring 配置Bean
- 10003---Spring--配置Bean
- Spring -- 注解配置Bean
- spring 注解配置bean
- JS事件绑定的代码
- 详解Flask 框架的核心功能
- HDU 4289 Control(最大流+拆点)
- MySQL 常用命令详解
- Vim代码补全插件——YouCompleteMe安装说明
- spring—Bean配置
- text-align:justify和display:inline-block
- Android studio常见故障排除--ADB Connection Error
- 全栈工程师--通往架构师之路
- UVAlive 7361 Immortal Porpoises(矩阵快速幂)
- sql sum合计某一列的值
- IDEA 调试 Hadoop程序
- mac os ssh -X
- LSSVM(Least Squares SVM)与SVR(支持向量回归)