依赖注入
使用默认的无参构造器注入
<bean id="userDao" class="com.zyz.impl.UserDaoImpl"></bean>
<bean id="userService" class="com.zyz.impl.UserServiceImpl"></bean>
UserServiceImpl.java
public class UserServiceImpl implements UserService {
@Override
public void save() {
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
UserDao userDao =(UserDao) context.getBean("userDao");
userDao.save();
}
}
UserController.java
public class UserController {
public static void main(String[] args) {
/*UserService userService = new UserServiceImpl();
userService.save();;*/
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
UserService userService = (UserService)context.getBean("userService");
userService.save();
}
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YlJQL7hq-1630312011116)(C:\Users\ZYZ\AppData\Roaming\Typora\typora-user-images\image-20210728113638768.png)]
把DAO和Service的实现配到容器中,可以降低依赖关系,也是降低耦合的一种方法
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oVzu7Ktv-1630312011120)(C:\Users\ZYZ\AppData\Roaming\Typora\typora-user-images\image-20210728114335801.png)]
Bean依赖注入的方式
- 构造方法(有参)
- set方法
set方法注入
eg:
<bean id="userDao" class="com.zyz.impl.UserDaoImpl"></bean>
<bean id="userService" class="com.zyz.impl.UserServiceImpl" >
<!-- name指的是set方法set后面的名字,首字母小写,对象的引用ref注入,调用set注入-->
<property name="userDao" ref="userDao"></property>
</bean>
这样只需要从容器中拿userService,userDao也会被拿到;
ref:表示引用容器中bean的id
P命名空间注入(也是set注入)
P命名空间注入本质也是set方法注入,但是比起上述的set方法注入更加方便,主要体现在配置文件中,
如下:首先要引入命名空间
xmlns:p="http://www.springframework.org/schema/p"
其次,需要修改注入方式
<bean id="userDao" class="com.zyz.impl.UserDaoImpl"></bean>
<bean id="userService" class="com.zyz.impl.UserServiceImpl" p:userDao-ref="userDao"/>
<!-- userDao-ref注入对象 -->
构造方法注入
<bean id="userDao" class="com.zyz.impl.UserDaoImpl"></bean>
<!-- 有参构造注入-->
<bean id="userService" class="com.zyz.impl.UserServiceImpl" >
<constructor-arg name="userDao" ref="userDao"></constructor-arg>
</bean>
UserServiceImpl.java
public class UserServiceImpl implements UserService {
private UserDao userDao;
//set构造
/* public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}*/
//有参构造注入
public UserServiceImpl(UserDao userDao) {
this.userDao = userDao;
}
public UserServiceImpl(){}
@Override
public void save() {
userDao.save();
}
}
Bean的依赖注入的数据类型
上面的操作,都属注入的引用Bean,除了对象的引用可以注入,普通数据类型,集合等都可以再容器中进行注入。
注入数据的三种数据类型
- 普通数据类型
- 引用数据类型
- 集合数据类型
普通数据注入
<bean id="userDao" class="com.zyz.impl.UserDaoImpl">
<property name="username" value="zhangshan"/>
<property name="age" value="19"/>
</bean>
public class UserDaoImpl implements UserDao {
private String username;
private int age;
public void setUsername(String username) {
this.username = username;
}
public void setAge(int age) {
this.age = age;
}
任选以上的一种依赖注入,执行;
集合的注入
<bean id="userDao" class="com.zyz.impl.UserDaoImpl">
<property name="list" >
<list>
<value>aaa</value>
<value>bbb</value>
</list>
</property>
<property name="userMap">
<map>
<entry key="u1" value-ref="user1">
</entry>
<entry key="u2" value-ref="user2">
</entry>
</map>
</property>
<property name="properties">
<props>
<prop key="p1">value1</prop>
<prop key="p2">value2</prop>
</props>
</property>
</bean>
<bean id="user1" class="com.zyz.pojo.User">
<property name="name" value="lasa"/>
<property name="addr" value="南昌"/>
</bean>
<bean id="user2" class="com.zyz.pojo.User">
<property name="name" value="nana"/>
<property name="addr" value="杭州"/>
</bean>
value-ref注入引用时,要保证该类的引用再容器中
public class UserDaoImpl implements UserDao {
private List<String> list;
private Map<String,User> userMap;
private Properties properties;
public void setList(List<String> list) {
this.list = list;
}
public void setUserMap(Map<String, User> userMap) {
this.userMap = userMap;
}
public void setProperties(Properties properties) {
this.properties = properties;
}
......
@Override
public void save() {
System.out.println(list);
System.out.println(userMap);
System.out.println(properties);
System.out.println("save running...");
}
引入其他配置文件
实际开发中,Spring的配置文件内容非常多,这就导致Spring配置很繁杂而且体积很大,所以可以将部分配置拆解到其他配置文件中,而在Spring主配置文件中通过import标签进行加载
<import resource="applicationContext-xxx.xml"