依赖注入(DI,dependency injection),由spring容器负责bean对象的创建、装配和管理,即bean对象的创建、装配和管理依赖于spring容器。
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/4799b4ff5318a5629f35401941110be6.png)
构造器注入
dao层
- com.jepcc.demo.dao.UserDao
package com.jepcc.demo.dao;
public interface UserDao {
void getUser();
}
- com.jepcc.demo.dao.impl.UserDaoImpl
package com.jepcc.demo.dao.impl;
import com.jepcc.demo.dao.UserDao;
public class UserDaoImpl implements UserDao {
@Override
public void getUser() {
System.out.println("getting user now");
}
}
service层
- com.jepcc.demo.service.UserService
package com.jepcc.demo.service;
public interface UserService {
void getUser();
}
- com.jepcc.demo.service.impl.UserServiceImpl
package com.jepcc.demo.service.impl;
import com.jepcc.demo.dao.UserDao;
import com.jepcc.demo.service.UserService;
public class UserServiceImpl implements UserService {
private UserDao userDao;
public UserServiceImpl(UserDao userDao){
this.userDao = userDao;
}
@Override
public void getUser() {
userDao.getUser();
}
}
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="foo" class="com.jepcc.demo.dao.impl.UserDaoImpl"></bean>
<bean id="service" class="com.jepcc.demo.service.impl.UserServiceImpl">
<constructor-arg name="userDao" ref="foo"></constructor-arg>
</bean>
</beans>
测试类
package com.jepcc.demo.test;
import com.jepcc.demo.service.UserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("config.xml");
UserService userService = (UserService) context.getBean("service");
userService.getUser();
}
}
setter注入
dao层
- com.jepcc.demo.dao.UserDao
package com.jepcc.demo.dao;
public interface UserDao {
void getUser();
}
- com.jepcc.demo.dao.impl.UserDaoImpl
package com.jepcc.demo.dao.impl;
import com.jepcc.demo.dao.UserDao;
public class UserDaoImpl implements UserDao {
@Override
public void getUser() {
System.out.println("getting user now");
}
}
service层
- com.jepcc.demo.service.UserService
package com.jepcc.demo.service;
public interface UserService {
void getUser();
}
- com.jepcc.demo.service.impl.UserServiceImpl
package com.jepcc.demo.service.impl;
import com.jepcc.demo.dao.UserDao;
import com.jepcc.demo.service.UserService;
public class UserServiceImpl implements UserService {
private UserDao userDao;
public void setUserDao(UserDao userDao){
this.userDao = userDao;
}
@Override
public void getUser() {
userDao.getUser();
}
}
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="foo" class="com.jepcc.demo.dao.impl.UserDaoImpl"></bean>
<bean id="service" class="com.jepcc.demo.service.impl.UserServiceImpl">
<property name="userDao" ref="foo"></property>
</bean>
</beans>
测试类
- com.jepcc.demo.test.Test
package com.jepcc.demo.test;
import com.jepcc.demo.service.UserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("config.xml");
UserService userService = (UserService) context.getBean("service");
userService.getUser();
}
}
本例中,spring容器创建id
为service
的bean对象com.jepcc.demo.service.impl.UserServiceImpl
时,发现该对象引用了一个id为foo
的bean对象,于是调用UserServiceImpl
的 setter
,将com.jepcc.demo.dao.impl.UserDaoImpl
设置为UserServiceImpl
的userDao
属性。因此在测试类Test
中,userService.getUser()
调用后,控制台打印出“getting user now”。