spring一 简介
spring三 bean的生命周期以及作用域
spring四 aop
spring的核心就是ioc和di,对于这两个概念我们这里还是再给出一遍或者可以看spring一 简介。
ioc(inverse of control) 控制反转,我们现在的创建对象实例都是通过new来创建,这样这个对象的创建权在于程序,但在spring中这个创建权给了spring,由spring来创建对象,这就是控制反转。
di(dependency injection)依赖注入,依赖注入就是在创建对象的时候注入对象的属性值。
对于ioc的理解,通过spring一的例子(创建对象的过程)应该有了一定的了解,那么我们我们就通过上次的module来看看ioc。
ioc 控制反转
我们在Test.java中通过new来创建一个对象,并通过set方法赋予name值。
public static void main(String[] args){
FirstDemo firstDemo = new FirstDemo();
firstDemo.setDemoName("普通demoName");
firstDemo.printName();
}
这个方法应该都没问题,那么我们接下来用spring配置bean的方法取得对象。
在applicationContext.xml中配置bean
<bean id="firstDemo" class="cn.pwc.demo.FirstDemo">
<property name="demoName" value="spring的demoName"/>
</bean>
id就是我们spring创建的对象的名称,后面在获取对象的时候通过getBean("id")方法获取到我们的对象。class是我们的类,指定这个bean创建的是哪个对象。property是我们的属性值,这里可以赋予类中指定属性的值,name指定类中的哪个属性,value就是赋予的值(value可以用ref替换,ref将会在di介绍里出现)。比如我们这里,创建一个名为firstDemo的FirstDemo对象,该对象的demoName值为springName。bean就创建好了,接下来去获取。
public static void main(String[] args){
//获取spring容器的对象
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
//取到对象
FirstDemo firstDemo = (FirstDemo) applicationContext.getBean("firstDemo");
//执行方法
firstDemo.printName();
}
这里没什么好说的,看注释就行。
这样我们也可以得到对象并执行对象的方法,现在再回想一下ioc的定义(控制反转),对象的创建权是不是交给了spring了。
di 依赖注入
至于依赖注入,其实我们已经接触到了,比如上面我们在配置bean的时候,properties不就对一个属性注入了一个值吗。那么怎么来看这个依赖。
我们在springDemo下新建一个module,取名为di。
di
创建如图的项目结构,demo包下新建三个java文件,firstDemo和secondDemo里面有两个属性,name和thirdDemo。
public class FirstDemo {
private String name;
private ThirdDemo td;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public ThirdDemo getTd() {
return td;
}
public void setTd(ThirdDemo td) {
this.td = td;
}
public void printName(){
System.out.println("名字是 " + name);
td.printName();
}
}
而thirdDemo只有name属性。最主要来看bean的配置。
<bean id="firstDemo" class="cn.pwc.demo.FirstDemo">
<property name="name" value="第一个demoName"/>
<property name="td" ref="thirdDemo"/>
</bean>
<bean id="secondDemo" class="cn.pwc.demo.SecondDemo">
<property name="name" value="第二个demoName"/>
</bean>
<bean id="thirdDemo" class="cn.pwc.demo.ThirdDemo">
<property name="name" value="第三个demoName"/>
</bean>
这里我们给firstDemo两个属性值都注入了值,而secondDemo只注入了name值,这样也就意味着secondDemo并没有拿到thirdDemo的对象也就不能调用thirdDemo的方法。而我们的firstDemo注入了thirdDemo对象,通过ref来进行注入,属性的值是一个具体对象的我们就要通过ref来注入。现在我们就可以说firstDemo依赖与thirdDemo了,你现在能删thirdDemo这个bean吗,不能。因为有一个对象在创建时需要将thirdDemo对象实例注入给他的属性,我们现在就可以说firstDemo依赖于thirdDemo了。通过test.java就可以看出确实firstDemo拿到了thirdDemo对象而secondDemo并没有拿到。
test
下面说三个不是很确定的点,都是我自己这么认为的,不知道对错。
1 spring如何通过配置创建我们想要得到的实例
通过java的反射机制来创建这些的bean实例
2 注入是通过bean的set方法注入的
当我们不写属性的set方法时我们是注入不进去属性值的
3 applicationContext这个容器到底是什么样的,可以让我们拿到bean
他应该像是一个hash表,有一个key和value,我们通过key值来取得value。
源码地址:springDemo
网友评论