什么是IOC和DI
IOC(Inversion of Control 控制反转):将实例化对象的控制权,由直接new转到spring容器通过反射机制实例化
DI(依赖注入):在创建对象时,把对象的依赖属性通过设置注入到对象中
后端项目基本结构:
引入IOC前
代码实现
实体类:User.java
@Data
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class User {
private Integer id;
private String name;
private Integer gender;
}
视图类:UserVo.java
@Data
@ToString
@NoArgsConstructor
public class UserVo {
private Integer id;
private String name;
private Integer gender;
private String genderName;
public UserVo(User user){
this.id=user.getId();
this.name=user.getName();
this.gender=user.getGender();
}
}
dao层接口:UserDao.java
public interface UserDao {
User getInfo(Integer id);
}
dao层实现类:UserDaoImpl.java
public class UserDaoImpl implements UserDao {
@Override
public User getInfo(Integer id) {
return new User(id,"张三",0);
}
}
service层接口:UserService.java
public interface UserService {
UserVo getInfo(Integer id);
}
service层实现类:UserServiceImpl.java
public class UserServiceImpl implements UserService {
private UserDao userDao;
@Override
public UserVo getInfo(Integer id) {
userDao = new UserDaoImpl();
User user = userDao.getInfo(id);
UserVo userVo = new UserVo(user);
userVo.setGenderName(userVo.getGender() == 0 ? "female" : "male");
return userVo;
}
}
controlletr层:UserController.java
public class UserController {
private UserService userService;
public UserVo getInfo(Integer id) {
userService=new UserServiceImpl();
return userService.getInfo(id);
}
}
测试类:Demo.java
public class Demo {
@Test
public void demo(){
UserController userController = new UserController();
UserVo info = userController.getInfo(1);
System.out.println(info);
}
}
测试
问题及解决
问题:代码的耦合度高,不利于扩展
解决:引入IOC或DI
引入IOC
首先要添加相关依赖并编写配置文件
代码实现
配置文件
<?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-4.3.xsd">
<bean id="userController" class="com.controller.UserController"/>
<bean id="userService" class="com.service.impl.UserServiceImpl"/>
<bean id="userDao" class="com.dao.impl.UserDaoImpl"/>
</beans>
controller层
public class UserController {
private UserService userService;
public UserVo getInfo(Integer id, ApplicationContext applicationContext) {
userService= (UserService) applicationContext.getBean("userService");
return userService.getInfo(id,applicationContext);
}
}
service层
public class UserServiceImpl implements UserService {
private UserDao userDao;
@Override
public UserVo getInfo(Integer id, ApplicationContext applicationContext) {
userDao = (UserDao) applicationContext.getBean("userDao");
User user = userDao.getInfo(id);
UserVo userVo = new UserVo(user);
userVo.setGenderName(userVo.getGender() == 0 ? "female" : "male");
return userVo;
}
}
测试类
public class Demo {
@Test
public void demo(){
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
UserController userController = (UserController) applicationContext.getBean("userController");
UserVo info = userController.getInfo(1, applicationContext);
System.out.println(info);
}
}
测试
引入DI
配置文件修改
<?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-4.3.xsd">
<context:component-scan base-package="com"/>
</beans>
代码实现
控制层
@Controller
public class UserController {
@Autowired
private UserService userService;
public UserVo getInfo(Integer id) {
userService=new UserServiceImpl();
return userService.getInfo(id);
}
}
业务层
@Service("userService")
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao;
@Override
public UserVo getInfo(Integer id) {
userDao = new UserDaoImpl();
User user = userDao.getInfo(id);
UserVo userVo = new UserVo(user);
userVo.setGenderName(userVo.getGender() == 0 ? "female" : "male");
return userVo;
}
}
数据持久层
@Repository("userDao")
public class UserDaoImpl implements UserDao {
@Override
public User getInfo(Integer id) {
return new User(id,"张三",0);
}
}
测试结果
常用注解介绍
- @Controller:将类注入到容器中,一般在控制层上使用
- @Service:将类注入到容器中,一般在业务层上使用
- @Repository:将类注入到容器中,一般在数据持久层上使用
- @Component:将类注入到容器中,一般在配置类上使用
- @Autowired:根据类型自动注入容器中的实例
- @Qualifier:通常和@Autowired一起使用,在其基础上再按照Bean的id注入实例
- @Resource:根据名称自动注入容器中的实例
注意:在类上使用@Controller、 @Service、@Repository、@Component时,可以指定Bean的id值,也可以不指定,如果没有指定Bean的id值,则其id值默认为该类的类名并且首字母小写