1.什么是DI
DI—Dependency Injection,即“依赖注入”:
组件之间依赖关系由容器在运行期决定,形象的说,即由容器动态的将某个依赖关系注入到组件之中。
Java Dependency Injection设计模式允许我们删除硬编码的依赖关系,并使我们的应用程序松散耦合,可扩展和可维护。我们可以在Java中实现依赖注入,以将依赖解析从编译时移至运行时。
总之一句话:给对象中的属性赋值。
2.依赖注入的类型
基本数据类型, 字符串类型,引用类型,集合类型。
3.使用spring注入数据
3.1 使用spring-DI注入基本数据类型(String,Interger)
(1)学生类代码
public class Student {
private Integer age;
private String name;
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
System.out.println("====调用了setAge====");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
System.out.println("====调用了setName====");
}
@Override
public String toString() {
return "Student{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
}
(2)配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<bean id="stu01" class="com.wx.demo01.Student">
<property name="name" value="张三" />
<property name="age" value="18" />
</bean>
</beans>
(3)测试类
public class Test {
public static void main(String[] args) {
ApplicationContext app = new ClassPathXmlApplicationContext("spring01.xml");
Student stu01 = (Student) app.getBean("stu01");
System.out.println(stu01);
}
}
运行效果图
3.2 注入类对象类型
(1)添加StuClass类
public class StuClass {
private Integer cid;
private String cname;
public Integer getCid() {
return cid;
}
public void setCid(Integer cid) {
this.cid = cid;
}
public String getCname() {
return cname;
}
public void setCname(String cname) {
this.cname = cname;
}
@Override
public String toString() {
return "StuClass{" +
"cid=" + cid +
", cname='" + cname + '\'' +
'}';
}
}
(2)将StuClass变为Student的属性,自动生成其set方法,修改toString(),将结果输出
运行效果图
3.3 注入集合类型
3.3.1 注入List集合类型
(1)将list集合添加为Student类属性
(2)修改配置文件,添加集合属性 为其设值
<bean id="stu01" class="com.wx.demo01.Student">
<property name="name" value="张三" />
<property name="age" value="18" />
<property name="sc" ref="stuClass" />
<property name="hobby" >
<list>
<value>唱歌</value>
<value>爬山</value>
<value>游泳</value>
</list>
</property>
</bean>
(3)输出测试类结果
3.3.2 注入Map集合类型
(1)为Student类添加map集合属性
(2)修改配置文件
<bean id="stu01" class="com.wx.demo01.Student">
<property name="name" value="张三" />
<property name="age" value="18" />
<property name="sc" ref="stuClass" />
<property name="hobby" >
<list>
<value>唱歌</value>
<value>爬山</value>
<value>游泳</value>
</list>
</property>
<property name="map">
<map>
<entry key="name" value="张三"/>
<entry key="age" value="18"/>
<entry key="sex" value="男"/>
</map>
</property>
</bean>
(3)
3.3.3 注入set集合
(1)添加类属性
(2)添加set配置内容
<property name="set">
<set>
<value>abc</value>
<value>abc</value>
<value>bcd</value>
<value>bcd</value>
</set>
</property>
(3)测试
注意:使用set集合的时候设置的属性值不重复
4.自动注入
(1)UserDao及其实现类
public interface UserDao {
public void show();
}
public class UserDao01 implements UserDao{
public void show() {
System.out.println("======userdao01=====");
}
}
public class UserDao02 implements UserDao{
public void show() {
System.out.println("======userdao02=====");
}
}
(2)UserController
public class UserController {
//将userdao变为自己的属性 然后调用其实现类的方法
private UserDao ud;
public UserDao getUd() {
return ud;
}
//必须要有set方法不然不能赋值
public void setUd(UserDao ud) {
this.ud = ud;
}
//调用实现类的方法
public void fun(){
ud.show();
}
}
(3)测试类
public class Test {
public static void main(String[] args) {
ApplicationContext app = new ClassPathXmlApplicationContext("user.xml");
UserController uc = (UserController) app.getBean("userController");
uc.fun();
}
}
(4)通过@Autowire通过byName 还是byType调用
1.通过byName调用
<?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.wx.demo.UserController" autowire="byName">
</bean>
<bean id="user02" class="com.wx.demo.UserDao01">
</bean>
<bean id="ud" class="com.wx.demo.UserDao02">
</bean>
</beans>
这里就要保证属性名和id一致
运行图
所以byName就是要让属性名和加载的实现类的id保持一致
2.通过byType
通过byType只能有一个bean 否则报错
总结:
autowire:自动注入属性值
no:不设置自动注入 默认值
byName:按照属性名自动注入属性值
byType:按照属性的类型自动注入
5.使用注解完成IOC和DI功能
(1)包扫描配置文件,我的配置文件名为user01.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="com.wx.demo01"/>
</beans>
(2)创建controller
/*
controller 表示控制层注解,如果没有设置bean的id 默认为类的名称首字母小写 相当于在spring配置文件中的
<bean id="" class="com.wx.demo01.UserController">
Autowire 按照类型自动注入 如果需要指定名称注入需要配合Qualifier注解使用
Qualifier 相当于<property name="ud" ref="user01">
* */
@Controller
public class UserController {
@Autowired
@Qualifier(value = "user01")
private UserDao ud;
public void fun(){
ud.show();
}
}
(3)创建userdao及其实现类
public interface UserDao {
public void show();
}
@Repository(value = "user01")
public class UserDao01 implements UserDao {
public void show() {
System.out.println("======userDao01=====");
}
}
@Repository(value = "user02")
public class UserDao02 implements UserDao {
public void show() {
System.out.println("======userDao02=====");
}
}
(4)测试类
public class Test {
public static void main(String[] args) {
ApplicationContext app = new ClassPathXmlApplicationContext("user01.xml");
UserController uc = (UserController) app.getBean("userController");
uc.fun();
}
}
注意:
执行流程
@Controller+@Respository+@Service+@Component
没有区别: 他们的底层都是用的@Component
实际意思就在于区分层的。
@Controller控制层
@Respository持久化层
@Service 业务层
@Component 最底层的bean注解。