一、注入对象
1.set注入对象
主要流程:创建业务层接口与实现类,调用数据库连接层的实现类
package com.hxy.service;
public interface UserService {
public void save();
}
package com.hxy.serviceImpl;
import com.hxy.UserDao;
import com.hxy.service.UserService;
public class Usererviceimpl implements UserService {
private UserDao userDaoimpl;
public void setUserDaoimpl(UserDao userDaoimpl) {
this.userDaoimpl = userDaoimpl;
}
@Override
public void save() {
userDaoimpl.method();
System.out.println("save成功");
}
}
红色部分为调用数据库连接层的实现类,但是这里的UserDao userDaoimpl并没有在这个类中进行定义,
如何进行定义呢?
需要通过spring框架的bean标签中的属性来实现依赖注入
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="userDaoimpl" class="com.hxy.impl.UserDaoimpl"></bean>
<bean id="userServiceimpl" class="com.hxy.serviceImpl.Usererviceimpl">
<property name="userDaoimpl" ref="userDaoimpl"></property>
</bean>
</beans>
其中property标签中的name指定的是public void setUserDaoimpl(UserDao userDaoimpl) { this.userDaoimpl = userDaoimpl; }代码中set后的UserDaoimpl,经过实验发现大小写好像都无所谓,但一定是在set后的内容,这是规定。
<bean id="userServiceimpl" class="com.hxy.serviceImpl.Usererviceimpl"> <property name="userDaoimpl" ref="userDaoimpl"></property>
上述内容中的ref就是进行对象的注入,注入的对象是一个bean标签,并且指代的是这个bean标签的id,<bean id="userDaoimpl" class="com.hxy.impl.UserDaoimpl"></bean>
2.有参构造方法注入对象:
import com.hxy.service.UserService; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class UserServiceTest { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("applicationcontext.xml"); UserService userService = (UserService) context.getBean("userServiceimpl"); userService.save(); } }
package com.hxy.serviceImpl;
import com.hxy.UserDao;
import com.hxy.service.UserService;
public class Usererviceimpl implements UserService {
private UserDao userDaoimpl;
//有参构造实例
public Usererviceimpl(UserDao userDaoimpl) {
this.userDaoimpl = userDaoimpl;
}
@Override
public void save() {
userDaoimpl.method();
System.out.println("save成功");
}
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="userDaoimpl" class="com.hxy.impl.UserDaoimpl"></bean>
<bean id="userServiceimpl" class="com.hxy.serviceImpl.Usererviceimpl">
<constructor-arg name="userDaoimpl" ref="userDaoimpl"></constructor-arg>
</bean>
</beans>
与setter构造类似,只不过在bean标签中的property换为constructor-arg表示构造参数,这里的name对应需要构造的类的参数,ref同样对应注入的类对应的标签id
二、注入列表
1.set注入列表
和setter注入对象相同
1.1在实现类中定义一个属性:列表List
1.2通过set方法构造
1.3在配置文件中进行配置,在bean标签创建好的类下继续使用<property>标签来定义,在<property>下继续定义一个<list>标签,<list>标签下使用value标签标记list中的每个值。
<bean id="userServiceimpl" class="com.hxy.serviceImpl.Usererviceimpl"> <property name="Userlist" > <list> <value>aaa</value> <value>bbb</value> </list> </property>
提问:如果list中的属性是一个类该怎么做?比如如下类Usererviceimpl包含属性 List<UserService> userlist;,其中UserService是另外一个类
package com.hxy.serviceImpl; import com.hxy.UserDao; import com.hxy.service.UserService; import java.util.List; public class Usererviceimpl implements UserService { private UserDao userDaoimpl; List<UserService> userlist; public void showlist(){ for (int i = 0; i < this.userlist.size(); i++) { System.out.println(this.userlist.get(i)); } } @Override public void show() { for (int i = 0; i < this.userlist.size(); i++) { System.out.println(this.userlist.get(i)); } } public void setUserlist(List userlist) { this.userlist = userlist; } public Usererviceimpl(List<UserService> userlist) { this.userlist = userlist; } }
此时的标签无非就是进行再一次嵌套:
<bean id="userServiceimpl" class="com.hxy.serviceImpl.Usererviceimpl">
<property name="Userlist" >
<list>
<ref bean="userDaoimpl"></ref>
</list>
</property>
这里的property name依然对应的是set方法的后缀,之后使用list标签,由于list标签下是一个类,所以使用bean标签来进行注入
2.有参构造注入列表
和set注入基本类似