1.创建对象
(1)有一个接口SomeService:
public interface SomeService
{
void doSome();
}
(2)一个类SomeServiceImpl实现了这个接口:
public class SomeServiceImpl implements SomeService
{
@Override
public void doSome()
{
System.out.println("执行了SomeServiceImpl的doSome()方法");
}
}
(3)在spring的配置文件beans.xml中创建了一个SomeServiceImpl类的对象,id叫someService
<beans>
<bean id="111" class="com.bjpowernode.service.impl.SomeServiceImpl">
</bean>
</beans>
(4)在我们编写的测试类中输入以下代码:
public class AppMain
{
public static void main(String[] args)
{
//表明这个spring配置文件编译后最终是在target/classes/beans.xml
String config="beans.xml";
//指定好spring配置文件的所在位置后需要创建一个容器对象
ApplicationContext ctx=new ClassPathXmlApplicationContext(config);
//此时这个ctx就是一个容器对象,通过这个容器对象就可以获取某个java对象
//从容器中获取指定名称的java对象,通过getBean(bean的id)方法获取指定名称的java对象
SomeService a= (SomeService) ctx.getBean("111");
//此时a就是一个SomeServiceImpl类的对象
//调用方法
a.doSome();
}
}
注意:在创建容器对象,即ApplicationContext ctx=new ClassPathXmlApplicationContext(config);
得到一个容器对象的时候,会把配置文件中所有的java对象都创建出来(即有几个bean标签就创建几个java对象)
2.创建完对象之后,给对象的属性赋值
(1)set注入(也叫设值注入)这种方法用的比较多,推荐使用这种方法
有一个类叫作Student,里面有两个属性name和age:
public class Student
{
private String name;
private Integer age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
在配置文件xml文件里面:在property标签里面,name的值表示属性名,value的值表示属性的值
<bean id="myStudent" class="com.bjpowernode.ba01.Student">
<property name="name" value="李四"/>
<property name="age" value="20"/>
</bean>
运行测试代码:
String config="ba01/applicationContext.xml";
ApplicationContext ctx=new ClassPathXmlApplicationContext(config);
Student student= (Student) ctx.getBean("myStudent");
System.out.println(student.getAge());
System.out.println(student.getName());
之所以叫作set注入是因为会调用类里面的setName方法和setAge方法,所以如果你的setName方法和setAge方法里面如果没有对属性进行赋值,那么即使你在xml文件里面进行了set注入
<bean id="myStudent" class="com.bjpowernode.ba01.Student">
<property name="name" value="李四"/>
<property name="age" value="20"/>
</bean>
这个myStudent对象的name属性和age属性还是没有被赋值
3.自动注入
首先,情境是一个类的属性之一是另一个类的对象:(Student类的对象的属性之一是一个School类对象)
首先有一个类School,这个类里面有两个属性,name和address(表示一个学校的名字和地址)
public class School
{
private String name;
private String address;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
然后另一个类是Student,这个类里面有三个属性,name,age还有一个School类属性school
public class Student
{
private String name;
private Integer age;
private School school;
public School getSchool() {
return school;
}
public void setSchool(School school) {
this.school = school;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
而在配置文件中:
<bean id="mySchool" class="com.bjpowernode.ba01.School">
<property name="name" value="北京大学"/>
<property name="address" value="海淀校区"/>
</bean>
<bean id="myStudent" class="com.bjpowernode.ba01.Student">
<property name="name" value="李四"/>
<property name="age" value="20"/>
<property name="school" ref="mySchool"/>
</bean>
一个bean表示一个java对象,所以这里在配置文件中定义了两个java对象
其中Student类对象myStudent有一个属性叫作student,它是一个java对象,一个id为mySchool的java对象(属性是一个对象)
运行如下代码:
String config="ba01/applicationContext.xml";
ApplicationContext ctx=new ClassPathXmlApplicationContext(config);
//上面创建好了一个容器对象
//下面创建一个Student类对象
Student student= (Student) ctx.getBean("myStudent");
//Student类里面有三个属性:name,age,school(其中school是一个School类对象)
System.out.println(student.getAge());
System.out.println(student.getName());
System.out.println(student.getSchool().getName());
System.out.println(student.getSchool().getAddress());
这种通过ref指定 属性是id为xxx的某个java对象,其实是手工注入
<bean id="mySchool" class="com.bjpowernode.ba01.School">
<property name="name" value="北京大学"/>
<property name="address" value="海淀校区"/>
</bean>
<bean id="myStudent" class="com.bjpowernode.ba01.Student">
<property name="name" value="李四"/>
<property name="age" value="20"/>
<property name="school" ref="mySchool"/>
</bean>
3.下面介绍什么是自动注入:
1.byName自动注入
School类和Student类不变
xml配置文件改变:不再用ref了,而是用autowire:
而且将School类对象的id从mySchool改为school了
<bean id="school" class="com.bjpowernode.ba01.School">
<property name="name" value="北京大学"/>
<property name="address" value="海淀校区"/>
</bean>
<bean id="myStudent" class="com.bjpowernode.ba01.Student" autowire="byName">
<property name="name" value="李四"/>
<property name="age" value="20"/>
</bean>
spring在创建id为myStudent这个对象的时候,发现autowire是byName,于是在给school这个属性赋值的时候,会去寻找有没有哪个java类对象的id叫作school,在整个容器内寻找这个java对象
重点java对象的id必须等于属性名
2.byType自动注入
spring在创建id为myStudent这个对象的时候,发现autowire是byType,于是在给school这个属性赋值的时候,会去寻找每个对象的类型是不是School,(因为school这个属性是一个School类对象),发现这个id叫作myschool的java对象它是一个School类对象,所以就是这个对象了
<bean id="mySchool" class="com.bjpowernode.ba01.School">
<property name="name" value="北京大学"/>
<property name="address" value="海淀校区"/>
</bean>
<bean id="myStudent" class="com.bjpowernode.ba01.Student" autowire="byType">
<property name="name" value="李四"/>
<property name="age" value="20"/>
</bean>
总结:1.byName是去比对每一个java bean的id,看属性名和这些id是否相同
2.byType是去比对每一个java bean的class,看属性属于的类A和这些对象属于的类是否相同
(或者一个java对象它所属的类是类A的子类,即继承xxx类也行)
3.不管是byName还是byType符合条件的都只能有一个java类对象,如果容器内多个java对象都符合,那就会报错