上一章讲解了spring的HelloWorld,现在我们开始讲解如何配置spring的bean。在此之前我们先要了解spring的IOC和DI。
注*:需要的jar包在spring4快速入门第一章HelloWorld中有
IOC:控制反转,我的理解是把资源准备好等你来拿,而不是需要时在去new对象
DI:依赖注入,我的理解是通过setter方法给属性赋值
接下来我们来讲讲HelloWorld案例
beans.xml文件
<!-- 配置一个 bean -->bean中有一个id,且id是唯一的。若不指名则为该类的类名并首字母小写。
<bean id="helloWorld" class="com.spring.hello.HelloWorld">
<!-- 为属性赋值 -->
<property name="hello" value="Hello World"></property>
</bean>
property 中有一个name,其name就是生产了setter方法的属性,value便是其值。
实例化Spring IOC容器
Spring IOC 容器在读取bean的配置文件之前要将其实例化
//1. 创建Spring 的IOC容器实例化Spring IOC 容器用到 ApplicationContext ,其实现类主要有ClassPathXmlApplicationContext();从类路径加载配置文件。还有个是FileSystemXmlApplicationContext();从文件系统加载配置文件
ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
//2. 从容器中获取 Bean 其实就是new 的过程
HelloWorld helloWorld = (HelloWorld) ctx.getBean("helloWorld");
// 也可以是 HelloWorld helloWorld = ctx.getBean(HelloWorld.class);
//3. 执行函数
helloWorld.helloWorld();
通过ApplicationContext的getBean方法获取bean;这样就new完了。
直奔主题:配置bean
依赖注入:主要有两个注入方法,一个是属性注入,另一个是构造方法注入。属性注入上面有讲,这里忽略。主要讲解构造注入。
先创建一个实体类User
package com.spring.entity;
public class User {
private Integer id;
private String name;
private String password;
public User() {
}
public User(Integer id, String name, String password) {
this.id = id;
this.name = name;
this.password = password;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User [id=" + id + ", name=" + name + ", password=" + password
+ "]";
}
}
构造方法注入
<bean id="user" class="com.spring.entity.User">读者是否发现了一个问题,构造方法注入怎么没有了name,不要慌!!!默认是按照构造器变量顺序来赋值,也可以通过index,和type自定义顺序,但是笔者觉得没有必要,只是给自己添加麻烦。
<constructor-arg value="1"></constructor-arg>
<constructor-arg value="ITDragon"></constructor-arg>
<constructor-arg value="此帐号没有密码"></constructor-arg>
</bean>
测试方法:
private ApplicationContext ctx = null;测试结果:
{
ctx = new ClassPathXmlApplicationContext("beans.xml");
}
@Test
public void ConstructorDI(){
User user = ctx.getBean(User.class);
System.out.println("依赖注入 之 构造方法注入 : "+user.toString());;
}
依赖注入 之 构造方法注入 : User [id=1, name=ITDragon, password=此帐号没有密码]
特殊符号
如果输入的内容有特殊符号,可以考虑使用<![CDATA[]]> 比如"<","%"等,输入直接保存,读者可以自己试试,解决方法就是 <![CDATA[<%ITDragon]]>将其包起来。引用其他bean
当需要应用到其他bean时可以使用ref
先创建一个需要调用User类的Main类:
package com.spring.entity;
public class Main {
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public void hello(){
System.out.println("应用ref : "+user.toString());
}
}
配置bean
<bean id="main" class="com.spring.entity.Main">测试方法:
<property name="user" ref="user"></property>
</bean>
@Test测试结果:
public void RefBean(){
Main main = ctx.getBean(Main.class);
main.hello();
}
应用ref : User [id=1, name=ITDragon, password=此帐号没有密码]
集合属性
创建一个公司类:
package com.spring.entity;配置bean,顺带把p命名空间也用上了
import java.util.List;
public class Company {
private List<User> users;
public List<User> getUsers() {
return users;
}
public void setUsers(List<User> users) {
this.users = users;
}
@Override
public String toString() {
return "Company [users=" + users + "]";
}
}
<!-- 属性注入 p命名-->测试方法:
<bean id="user1" class="com.spring.entity.User"
p:id="2"
p:name="这不是昵称"
p:password="这是p命名空间"
/>
<!-- List集合 -->
<bean id="userList" class="com.spring.entity.Company">
<property name="users">
<list>
<ref bean="user"/>
<ref bean="user1"/>
</list>
</property>
</bean>
@Test
public void ListAndP(){
Company companys = (Company) ctx.getBean("userList");
System.out.println(companys.toString());
}
测试结果:
Company [users=[User [id=1, name=ITDragon, password=此帐号没有密码], User [id=2, name=这不是昵称, password=这是p命名空间]]]Map也是一样,笔者就自己试试,不做太多描述。
网址链接:http://blog.csdn.net/qq_19558705/article/details/49994191
写了几个小时了,先就这样吧,以上代码都是笔者亲测可用的,不要嫌麻烦,麻烦是学不好的,如果有什么问题和建议可以留言,我会及时处理。
更多干货等你来拿 http://www.itit123.cn/