1.什么是DI?
IOC:控制反转 创建对象!
DI 依赖注入:目的就是给对象中的属性赋值。
2.依赖注入的类型
基本数据类型, 字符串类型,引用类型,集合类型。
3.如何实现注入对象的属性值
创建一个类并提供set方法
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
private String name;
private Integer age;
}
创建配置文件:---在bean标签中<property name="属性名" >
<!--spring容器会帮你创建该bean的对象-->
<bean id="user" class="com.zsy.demo2.User">
<!--property:表示为类中属性注入值,调用的为set方法
name:表示属性名
value:注入基本类和字符串类型时使用value
-->
<property name="name" value="张三"/>
<property name="age" value="20"/>
</bean>
测试
public class Test {
public static void main(String[] args) {
ApplicationContext app = new ClassPathXmlApplicationContext("spring02.xml");
User u = (User) app.getBean("user");
System.out.println(u);
}
}
4.使用spring注入其他数据类型
实体类
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
private String name;
private Integer age;
private Dept dept;
private List list;
private Set set;
private Integer[] sex;
}
配置文件: 注入list、set和map集合以及数组5.
5.自动注入。
使用工厂实现自动注入
UserController
package com.zsy.demo3;
/**
* @Author zsy
* @Date 2022/6/13 18:21
* @PackageName:com.zsy.demo3
* @ClassName: UserController
* @Description: TODO
* @Version 1.0
*/
public class UserController {
private IUserDao iUserDao;
public void fun(){
iUserDao.pint();
}
public void setiUserDao(IUserDao iUserDao) {
this.iUserDao = iUserDao;
}
}
IUserDao与UserDao1、UserDao2
public interface IUserDao {
public void pint();
}
public class UserDao1 implements IUserDao{
@Override
public void pint() {
System.out.println("------UserDao1--------");
}
}
public class UserDao2 implements IUserDao{
@Override
public void pint() {
System.out.println("--------UserDao2---------");
}
}
配置文件
<?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="userController" class="com.zsy.demo3.UserController" autowire="byName">
<property name="iUserDao" ref="userDao2"/>
</bean>
<!--autowire:自动注入属性值
no:不设置自动注入默认值
byName:按照属性名称自动注入属性值
byType:按照属性的类型自动注入。
-->
<bean id="userDao1" class="com.zsy.demo3.UserDao1"></bean>
<bean id="userDao2" class="com.zsy.demo3.UserDao2"></bean>
</beans>
测试
package com.zsy.demo3;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* @Author zsy
* @Date 2022/6/13 18:21
* @PackageName:com.zsy.demo3
* @ClassName: Test
* @Description: TODO
* @Version 1.0
*/
public class Test {
public static void main(String[] args) {
ApplicationContext app = new ClassPathXmlApplicationContext("spring03.xml");
UserController userController = (UserController) app.getBean("userController");
userController.fun();
}
}
6.使用注解完成IOC和DI功能
配置包扫描
<comtext:component-scan base-package="com.zsy.demo1"/>
创建controller控制层
/*表示控制层注解,如何没有设置bean的id 默认为类的名称首字母小写
相当于在spring配置文件钟<bean id=""
class="com.zsy.demo01.UserController"/>*/
@Controller
public class UserController {
//@Autowired //按照类型自动注入 如果需要自己指定名注入需要使用另一个注解配合使用
@Autowired
//<property name="userDao" ref="userDaoImpl01">
@Qualifier(value = "userDao1")
private IUserDao iud;
public void fun(){
iud.show();
}
}
dao接口和实现类
public interface IUserDao {
public void show();
}
@Repository
public class UserDao1 implements IUserDao{
@Override
public void show() {
System.out.println("~~~~~~~~~userDao1~~~~~~~~~");
}
}
@Repository
public class UserDao2 implements IUserDao{
@Override
public void show() {
System.out.println("~~~~~~~userDao2~~~~~~~");
}
}
测试:
@Controller+@Respository+@Service+@Component
没有区别: 底层都使用@Component
实际意义就在于区分层的。
- @Controller控制层
- @Respository持久化层
- @Service 业务层
- @Component 最底层的bean注解。