spring-DI的介绍和使用

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注解。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值