logo头像

一路过来,不过游牧自己。。

SSM之Spring(三)


Spring中的配置文件是实现ioc的一种重要的方式,那这些配置文件都有哪些内容,他们都是如何设置的呢,下面就来列咧这些配置文件该怎么写!IOC依赖是如何注入的!

一、配置文件详解

1、设置别名

(1)这里是设置别名的一种方式,可设置多个别名,用alias关键字

1
<alias name="user3" alias="u3"/>

就在配置文件中设置成u3,这时候来说,原来的id是user3,但是在设置时将别名设置成了u3,在Test中,调用u3,这时候和加载user3的效果是一样的!

1
User us = (User)acApplicationContext.getBean("u3");

这时候输出的结果都是:

1
name=王五

(2)另一种方式是在当前的bean中去设置,通过name去设置别名:

1
2
3
4
</bean>
<bean id="user1" name="u3,u4" class="cn.user.User">
<constructor-arg index="0" value="李四"></constructor-arg>
</bean>

如上述代码所示,通过name就可以调用了,但是要注意的是,这里逗号分隔的u3,u4,表示有两个别名,用u3和用u4的效果是一样的!

2、bean的具体配置方式:

下面好好看这段话:
id是bean的标识符,要唯一,若没有设置id,name就成了默认标识符,如果配置了id,又配置了name,那name就是别名,name可以设置多个,分隔符是逗号,分号和空格,Class是bean的权限定名=包名加类名,如果不配置id和name,那么根据applicationContext。getBean(class)获取对象

3、团队协作的时候,通过import来实现

1
<import resource="cn/test/beans.xml"/>

这是在另一个文件中写的,这时候只要调用这个文件就好了,有利于团队之间的开发和工作!

二、依赖的注入

(DI)dependency injection
依赖:指bean对象创建依赖于容器的创建,Bean对象依赖于资源
注入:指Bean对象依赖的资源由容器来设置和装配

(1)Spring注入的两类

一是构造器注入:见IOC创建对象
二是Spring注入:依赖于setter注入
要求:被注入的属性必须要有set方法,set方法的方法名由set属性首字母大写,若属性是boolean类型,返回没有get方法,则是isXXX

(2)各种注入方式:

a)常量的注入

这里先写一个Student类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Student {
private String name;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}
public void show(){
System.out.println("name="+name);
}
}

然后写配置文件

1
2
3
4
<bean id="student" class="cn.student.Student">
<property name="name" value="张三丰">
</property>
</bean>

最后写Test

1
2
3
4
5
6
7
public class Test {
public static void main(String[] args) {
ApplicationContext ac=new ClassPathXmlApplicationContext("beans.xml");
Student stu=(Student)ac.getBean("student");
stu.show();
}
}

结果

1
name=张三丰

这里要注意下beans.xml文件的放置位置,要放在Src下,如果不是,就会报错:

1
class path resource [beans.xml] cannot be opened because it does not exist

我也是没经验找了好久解决了!

b)bean注入

就是说我们注入的时候不再是简单的注入,我们可以注入另外一个bean,其实注入的是另外一个对象,这就是相对来说在student中设置一个对象参数:

1
2
3
4
private Address addr;
public void setAddr(Address addr) {
this.addr = addr;
}

其中定义了一个Adress类,

1
2
3
4
5
6
7
8
9
10
11
public class Address {
private String addr;

public String getAddr() {
return addr;
}

public void setAddr(String addr) {
this.addr = addr;
}
}

然后在配置文件中写他的常量注入和bean注入

1
2
3
4
5
<bean id="addr" class="cn.student.Address" >
<property name="addr" value="安徽黄山"></property></bean>
<bean id="student" class="cn.student.Student">
<property name="name" value="张三丰"></property>
<property name="addr" ref="addr"></property>

如上所示,先写的是Address bean,对bean进行初始化,然后在student bean中进行bean的注入

c)数组注入

要数组注入的话,就要在tudent类中设置一个数组

1
2
3
4
 private String[] books;
public void setBooks(String[] books) {
this.books = books
}

这时候,在配置文件中要加的配置参数是:

1
2
3
4
5
6
7
<property name="books">
<array>
<value>吸血鬼日记</value>
<value>哈利波特</value>
<value>傲慢与偏见</value>
</array>
</property>

然后再show()函数中写上遍历

1
2
3
for(int i=0;i<books.length;i++){
System.out.println(books[i]);}
}

就可以遍历得到:

1
2
3
吸血鬼日记
哈利波特
傲慢与偏见

d)List注入

在student中加入:

1
2
3
4
private List<String> hobbies;
public void setHobbies(List<String> hobbies) {
this.hobbies = hobbies;
}

在bean中加入:

1
2
3
4
5
6
7
<property name="hobbies">
<list>
<value>篮球</value>
<value>羽毛球</value>
<value>music</value>
</list>
</property>

e)map注入

在student中加入一个Map:

1
2
3
4
private Map<String, String> cards;
public void setCards(Map<String, String> cards) {
this.cards = cards;
}

然后再bean中设置

1
2
3
4
5
6
7
8
9
<property name="cards">
<map>
<entry key="中国银行" value="3429876"></entry>
<entry>
<key><value>建设银行</value></key>
<value>622710023478234234</value>
</entry>
</map>
</property>

f)set注入

在student中加入一个Set,类型是一个String:

1
2
3
4
private Set<String> games;
public void setGames(Set<String> games) {
this.games = games;
}

然后再bean中设置

1
2
3
4
5
6
<property name="games">
<set>
<value>LOL</value>
<value>dota</value>
</set>
</property>

g)NUll注入

当有些参数可以为空的时候:

1
2
3
4
private String wife;
public void setWife(String wife) {
this.wife = wife;
}

对于大部分学生来说,wife这一项基本上是空的:

1
<property name="wife"><null/></property>

这时候,输出结果:

1
wife=null

h)properties注入

有没有可能就是直接利用一系列参数。答案是用properties:

1
2
3
4
private Properties info;
public void setInfo(Properties info) {
this.info = info;
}

在bean中我们写一下配置:

1
2
3
4
5
6
7
<property name="info">
<props>
<prop key="学号">20162821</prop>
<prop key="sex">男</prop>
<prop key="name">小明</prop>
</props>
</property>

这样就可以组建一个properties了!

i)p命名空间注入

前面的student类太过庞大,我们再重新写个 User类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public class User {
private String name;
private int age;
@Override
public String toString() {
return "User [name=" + name + ", age=" + age + "]";
}
public User(String name, int age) {
super();
this.name = name;
this.age = age;
}
public User() {
super();
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}

在配置文件中设置,这时候一定要注意!要在头文件中加入文件设置才行:

1
xmlns:p="http://www.springframework.org/schema/p"

还有,p命名空间需要设置set方法:

1
2
3
<!-- p命名空间注入 属性依然要设置Set方法 -->
<bean id="user" class="cn.student.User" p:name="浪子" p:age="19">
</bean >

可以看到,这里就是直接设置了,非常方便:
结果:

1
User [name=浪子, age=19]

j)C注入

一样的,使用User类,这个类必须有带参的构造方法:
bean的写法,首先一定要记得加一个头文件:

1
xmlns:c="http://www.springframework.org/schema/c"

然后进行配置:

1
2
<bean id="user1" class="cn.student.User" c:name="放羊" c:age="128">
</bean >

这里的输出结果是:

1
User [name=放羊, age=128]

这就基本对配置文件的配置方式基本写完了,重视基本功,至少要会用,通过配置文件来创建Bean真的是一种很强健的一种方式!

学习之路漫漫长,多走路,多思考!
——————YoungerFary

微信打赏

赞赏是不耍流氓的鼓励