在Spring中,容器注入对象的方法主要有两种,分别是构造函数注入方式与set方法注入方式,其中构造函数方法可以根据参数索引,类型和名称来适配。
实体类 Student.java
public class Student {
private String message;
public void setMessage(String message) {
this.message = message;
}
public Student(){
System.out.println("Student对象实例化");
}
public Student(String name){
System.out.println("Student对象实例化 name="+name);
}
public Student(int i,String name){
System.out.println("Student对象实例化");
System.out.println("i="+i+" name="+name);
}
public void printmessage(){
System.out.println(message);
}
}
构造函数注入方式:
<!-- 配置要管理的bean 无参构造 -->
<bean name="stun" id="stu" class="com.java.demo.Student"></bean>
<!-- 配置一个根据参数值创建bean实例的方式jedis 会用到 -->
<bean name="stu1" class="com.java.demo.Student">
<!-- 通过构造函数的类型,名称,索引来适配 -->
<!-- 通过索引来智能匹配 -->
<constructor-arg index="0" value="10"></constructor-arg>
<constructor-arg index="1" value="10"></constructor-arg>
</bean>
<bean name="stu2" class="com.java.demo.Student">
<!-- 通过类型来智能匹配 -->
<constructor-arg type="int" value="12"></constructor-arg>
<constructor-arg type="String" value="12"></constructor-arg>
</bean>
<bean name="stu3" class="com.java.demo.Student">
<!-- 通过名称来智能匹配 -->
<constructor-arg name="i" value="13"></constructor-arg>
<constructor-arg name="name" value="13"></constructor-arg>
</bean>
通过set方法来注入:对message属性进行赋值 即依靠属性方法来注入
<bean name="stu4" class="com.java.demo.Student">
<property name="message" value="初始的信息"></property>
</bean>
调用生成 TestStudent.java
public static void main(String[] args) {
// TODO Auto-generated method stub
//Student stu=new Student();
//实例化spring容器放到spring中存储,xml是一个工厂,吧容器中需要管理的bean实例存储到map集合中
ApplicationContext ctx=new ClassPathXmlApplicationContext("container.xml");//需要一个参数获取sping配置的路径
//Map<String,Object>就是key对应bean的id或name value就是class属性值反射生成的对象
Student stu=(Student) ctx.getBean("stu4");
stu.printmessage();
}
注:
当然在使用构造函数的同时使用set方法也是可以的。当然即使我们讲set方法写在前面,肯定也是通过先调用构造方法之后再进行set值的,即顺序无所谓,相信Spring框架是很智能的
即所有的都与容器来交互而不与对象进行交互。
对于在构造函数含有多个相同类型的参数时,我们使用构造函数的方法来构造时是按照参数的顺序来进行构造的。
如:
在xml文件中:
运行结果:可以看到是按顺序来的
开始完成一个项目
首先,讲项目的目录建立起来
然后要理解Spring的使用,我们需要与原本的开发思路做对比:
UserDaoImpl.java
public class UserDaoImpl implements UserDao{
public UserDaoImpl(){
System.out.println("USerDaoImpl-instance");
}
@Override
public void addUser() {
// TODO Auto-generated method stub
System.out.println("添加用户信息-->到DB");
}
}
UserServiceImpl.java
public class UserServiceImpl implements UserService{
//UserDao user=new UserDaoImpl();//在spring框架中IOC方式是不使用这种方式的
private UserDao userdao;//这是通过属性的方式来注入
public UserServiceImpl(){
//这是构造函数
System.out.println("service-instance");//无参构造
}
public UserServiceImpl(UserDao userDao){
//这是构造函数
System.out.println("service-instance");
this.userdao=userDao;
}
public void saveUser(){
userdao.addUser();
}
}
可以看到,我们在原本的开发中会将UserDao对象生成然后进行调用,但是在使用了Spring后,我们需要使用依赖注入的方式来进行,那么我们可以使用构造方法或者set的方式来进行。
最后,则是进行调用生成实例
完成了以上后,就可以对一般的项目开发步骤有所了解了。
而这种构造方法的方式在我们开发项目中是不常用的,我们大多使用的是set的方式来进行构造。
但大家可以发现,在我们的实际项目中,如果是这样进行依赖装配注入的话,势必是很麻烦的,那么有什么好用办法呢?