什么是依赖注入:
应用程序依赖IOC容器注入所需的外部资源
依赖:应用程序依赖IOC容器,需要容器为应用程序提供对象所需的外部资源。
注入:IOC容器将外部的资源(对象,资源,常量数据等)注入到某个需要这些资源的对象中。
依赖注入的方式:
一、构造方法注入(无法确保参数的顺序问题)
在spring的配置文件中注册UserService,将UserDaoJdbc通过constructor-arg标签注入到UserService的某个有参数的构造方法
<!-- 注册userService --> <bean id="userService" class="com.lyu.spring.service.impl.UserService"> <constructor-arg ref="userDaoJdbc"></constructor-arg> </bean> <!-- 注册jdbc实现的dao --> <bean id="userDaoJdbc" class="com.lyu.spring.dao.impl.UserDaoJdbc"></bean>
无论UserService中有一个或着多个构造函数,该注册方式,只会将属性注入到只有一个参数的构造函数中。
public class UserService implements IUserService { private IUserDao userDao; private User user; public UserService(IUserDao userDao) { System.out.println("这是有一个参数的构造方法"); this.userDao = userDao; } public UserService(IUserDao userDao, User user) { System.out.println("这是有两个参数的构造方法"); this.userDao = userDao; this.user = user; } public void loginUser() { userDao.loginUser(); } }
对于多个参数的构造函数可以采用以下方法进行属性的注入,无法定义两个参数的顺序,如果两个构造函数的入参只有参数顺序不一致,那么该方法无法正常进行注入。
<!-- 注册userService --> <bean id="userService" class="com.lyu.spring.service.impl.UserService"> <constructor-arg name="userDao" ref="userDaoJdbc"></constructor-arg> <constructor-arg name="user" ref="user"></constructor-arg> </bean>
二、setter注入
使用类中的set***方法,通过 反射调用,实现注入。
public class UserService implements IUserService { private IUserDao userDao1; public void setUserDao(IUserDao userDao1) { this.userDao1 = userDao1; } public void loginUser() { userDao1.loginUser(); } }
三、基于注解的注入
使用 @Resource 或者 @Autowired 注解进行依赖注入;