【Spring】一文带你吃透基于注解的DI技术

这篇具有很好参考价值的文章主要介绍了【Spring】一文带你吃透基于注解的DI技术。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【Spring】一文带你吃透基于注解的DI技术

个人主页: 几分醉意的CSDN博客_传送门

💖基于注解的DI

✨概念

基于注解的DI:使用spring提供的注解,完成java对象创建,属性赋值。

注解使用的核心步骤:
1.在源代码加入注解,例如@Component。
2.在spring的配置文件,加入组件扫描器的标签。

✨@Component注解创建对象

@Component: 表示创建对象,对象放到容器中。 作用是

  •   属性:value ,表示对象名称,也就是bean的id属性值
    
  •   位置:在类的上面,表示创建此类的对象。
    
 @Component(value = "myStudent") 等同于
< bean id="myStudent" class="com.ba01.Student" />
//使用value 指定对象的名称
//@Component(value = "myStudent")
//省略value
@Component("myStudent")

//没有提供自定义对象名称, 使用框架的默认对象名称:类名首字母小写
//@Component
public class Student {

    private String name;
    private int age;

    public Student() {
        System.out.println("Student无参数构造方法");
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

✨声明组件扫描器

声明组件扫描器:使用注解必须加入这个语句。

<context:component-scan base-package="注解所在的包名"/>
    component-scan:翻译过来是组件扫描器,组件是java对象。
        属性: base-package 注解在你的项目中的包名。
              框架会扫描这个包和子包中的所有类,找类中的所有注解。
              遇到注解后,按照注解表示的功能,去创建对象, 给属性赋值。

认识了组件扫描器,然后我们来到Spring配置文件来使用它

<?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">

    <!--声明组件扫描器:使用注解必须加入这个语句
        component-scan:翻译过来是组件扫描器,组件是java对象。
            属性: base-package 注解在你的项目中的包名。
                  框架会扫描这个包和子包中的所有类,找类中的所有注解。
                  遇到注解后,按照注解表示的功能,去创建对象, 给属性赋值。
    -->
    <context:component-scan base-package="com.b01"/>

</beans>

注意:最上面的都是一些需要的约束文件,当你把组件扫描器写上去后,也会自动的添加对应的约束文件。

那么接下来我们创建一个测试类,进行测试。

public class MyTest {

    @Test
    public void test01(){
        String config="applicationContext.xml";
        ApplicationContext ctx = new ClassPathXmlApplicationContext(config);

		//后面的myStudent是上面@Component注解创建对象时设置的对象名
        Student student = (Student) ctx.getBean("myStudent");

        System.out.println("student=="+student);
    }
}

✨创建对象的四个注解

经过刚刚的学习,我们已经了解了@Component注解创建对象的使用方法,那么还有其它的相关注解吗?当然有,下面我们将介绍的是和@Component功能相同的创建对象的注解。

1. @Repository : 放在dao接口的实现类上面,表示创建dao对象,持久层对象,能访问数据库。

2).@Service : 放在业务层接口的实现类上面, 表示创建业务层对象, 业务层对象有事务的功能。

3.@Controller:放在控制器类的上面,表示创建控制器对象。 属于表示层对象。控制器对象能接受请求,把请求的处理结果显示给用户。

以上四个注解都能创建对象,但是@Repository @Service @Controller有角色说明, 表示对象是分层的。

✨扫描多个包的三种方式

<?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">

    <!--声明组件扫描器:使用注解必须加入这个语句
        component-scan:翻译过来是组件扫描器,组件是java对象。
            属性: base-package 注解在你的项目中的包名。
                  框架会扫描这个包和子包中的所有类,找类中的所有注解。
                  遇到注解后,按照注解表示的功能,去创建对象, 给属性赋值。
    -->
    <context:component-scan base-package="com.b01"/>

    <!--扫描多个包的三种方式-->
    <!--第一种,使用多次组件扫描器-->
    <context:component-scan base-package="com.b01"/>
    <context:component-scan base-package="com.b02"/>

    <!--第二种,使用分隔符( ;或,),指定多个包-->
    <context:component-scan base-package="com.b01;com.b02"/>

    <!--第三种:指定父包-->
    <context:component-scan base-package="com"/>
</beans>

✨@Value简单类型属性赋值

@Value: 简单类型属性赋值
属性:value 简单类型属性值
位置:1.在属性定义的上面 ,无需set方法,推荐使用。2.在set方法的上面。

在属性定义的上面定义

package com.bjpowernode.ba02;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;


@Component("myStudent")
public class Student {
    @Value(value = "李四")
    private String name ;
    //括号里面的value也可以省略
    @Value("20")
    private int age;

    public Student() {
        System.out.println("Student无参数构造方法");
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

第二种方式:在set方法的上面

package com.bjpowernode.ba02;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;


@Component("myStudent")
public class Student {
    private String name ;
    private int age;
    public Student() {
        System.out.println("Student无参数构造方法");
    }

    @Value("22")
    public void setAge(int age) {
        System.out.println("setAge===="+age);
        this.age = age;
    }
    
    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

✨@Value使用外部属性配置文件

这里我创建了一个名为myconf.properties的配置文件

【Spring】一文带你吃透基于注解的DI技术

然后在配置文件输入相应的内容。
【Spring】一文带你吃透基于注解的DI技术
然后我们打开spring配置文件,在spring文件中读取使用它

<?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">

    <!--声明组件扫描器:使用注解必须加入这个语句
        component-scan:翻译过来是组件扫描器,组件是java对象。
            属性: base-package 注解在你的项目中的包名。
                  框架会扫描这个包和子包中的所有类,找类中的所有注解。
                  遇到注解后,按照注解表示的功能,去创建对象, 给属性赋值。
    -->
    <context:component-scan base-package="com.b01"/>


    <!--读取外部的属性配置文件
        property-placeholder:读取properties这样的文件
    -->
    <context:property-placeholder location="classpath:/myconf.properties" />
</beans>

注意:location=“classpath:/类路径”

下一步我们开始还有外部文配置件。

语法 :@Value(${"key"})

@Component("myStudent")
public class Student {
    //使用外部属性文件中的数据,语法 @Value(${"key"})
    @Value("${myname}")
    private String name ;

    private int age;

    public Student() {
        System.out.println("Student无参数构造方法");
    }


    public void setName(String name) {
        this.name = name;
    }
    //使用外部属性文件中的数据
    @Value("${myage}")
    public void setAge(int age) {
        System.out.println("setAge===="+age);
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

✨@Autowired引用类型属性赋值

 * @Autowired: spring框架提供的,给引用类型赋值的,使用自动注入原理。
 *             支持byName,byType。默认是byType.

💫byType自动注入

  •   位置:1)在属性定义的上面,无需set方法,推荐使用
    
  •       2)在set方法的上面
    

创建一个School类

@Component("mySchool")
public class School {
    @Value("安徽大学")
    private String name;

    @Value("安徽的合肥市")
    private String address;

    public void setName(String name) {
        this.name = name;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "School{" +
                "name='" + name + '\'' +
                ", address='" + address + '\'' +
                '}';
    }
}

在Student类中使用School

@Component("myStudent")
public class Student {

    //默认使用byType
    @Autowired
    private School school;

    public Student() {
        System.out.println("Student无参数构造方法");
    }


    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", school=" + school +
                '}';
    }
}

Spring配置文件

<?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.bjpowernode.ba07"/>

    <!--读取外部的属性配置文件
        property-placeholder:读取properties这样的文件
    -->
    <context:property-placeholder location="classpath:/myconf.properties" />
</beans>

测试

public class MyTest3 {
    @Test
    public void test01(){
        String config="applicationContext.xml";
        ApplicationContext ctx = new ClassPathXmlApplicationContext(config);

        Student student = (Student) ctx.getBean("myStudent");

        System.out.println("student=="+student);
    }
}

💫byName自动注入

byName自动注入
1.@Autowired:给引用类型赋值。
2.@Qualifer(value=“bean的id”):从容器中找到指定名称的对象,把这个对象赋值给引用类型。

@Component("myStudent")
public class Student {

    //byName
    @Autowired
    @Qualifier("mySchool")
    private School school;

    public Student() {
        System.out.println("Student无参数构造方法");
    }


    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", school=" + school +
                '}';
    }
}

测试

public class MyTest3 {
    @Test
    public void test01(){
        String config="applicationContext.xml";
        ApplicationContext ctx = new ClassPathXmlApplicationContext(config);
        Student student = (Student) ctx.getBean("myStudent");
        System.out.println("student=="+student);
    }
}

💫required属性

 *        属性:required :boolean类型的属性, 默认true
 *             true:spring在启动的时候,创建容器对象时候,会检查引用类型是否赋值成功。
 *                   如果赋值失败, 终止程序执行,并报错。
 *             false:引用类型赋值失败,程序正常执行,不报错。引用类型的值是null

示例:
【Spring】一文带你吃透基于注解的DI技术文章来源地址https://www.toymoban.com/news/detail-438615.html

✨@Resource引用类型属性赋值

 * 引用类型
 * @Resource: 来自jdk中,给引用类型赋值的,支持byName,byType.默认是byName
 *             spring支持这个注解的使用。
 *      位置:1)在属性定义的上面,无需set方法, 推荐使用
 *            2)在set方法的上面
 *
 *  说明,使用jdk1.8带有@Resource注解, 高于jdk1.8没有这个@Resource,
 *  需要加入一个依赖。
 *    <dependency>
 *       <groupId>javax.annotation</groupId>
 *       <artifactId>javax.annotation-api</artifactId>
 *       <version>1.3.2</version>
 *     </dependency>

💖投票传送门(欢迎伙伴们投票)

到了这里,关于【Spring】一文带你吃透基于注解的DI技术的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 【C++】一文带你吃透C++继承

    【C++】一文带你吃透C++继承

    🍎 博客主页:🌙@披星戴月的贾维斯 🍎 欢迎关注:👍点赞🍃收藏🔥留言 🍇系列专栏:🌙 C/C++专栏 🌙那些看似波澜不惊的日复一日,一定会在某一天让你看见坚持的意义!🌙 🍉一起加油,去追寻、去成为更好的自己! 提示:以下是本篇文章正文内容,下面案例可供参

    2024年02月07日
    浏览(333)
  • 【C++】一文带你吃透C++多态

    【C++】一文带你吃透C++多态

    🍎 博客主页:🌙@披星戴月的贾维斯 🍎 欢迎关注:👍点赞🍃收藏🔥留言 🍇系列专栏:🌙 C/C++专栏 🌙那些看似波澜不惊的日复一日,一定会在某一天让你看见坚持的意义!-- 算法导论🌙 🍉一起加油,去追寻、去成为更好的自己! @TOC 提示:以下是本篇文章正文内容,

    2024年02月08日
    浏览(81)
  • 一文带你入门并吃透状态压缩DP

    一文带你入门并吃透状态压缩DP

    【本文比较适合有一定动态规划和位运算基础的童鞋阅读】 首先先讲讲什么是状态压缩 状态压缩 就是使用某种方法,简明扼要地以最小代价来表示某种状态,通常是用一串01数字(二进制数)来表示各个点的状态。这就要求使用状态压缩的对象的点的状态必须只有两种,0

    2024年02月09日
    浏览(46)
  • 【Web前端】一文带你吃透CSS(中篇)

    【Web前端】一文带你吃透CSS(中篇)

    前端学习路线小总结 : 基础入门: HTML CSS JavaScript 三大主流框架: VUE REACT Angular 深入学习: 小程序 Node jQuery TypeScript 前端工程化

    2023年04月25日
    浏览(48)
  • 【Web前端】一文带你吃透CSS(完结篇)

    【Web前端】一文带你吃透CSS(完结篇)

    前端学习路线小总结 : 基础入门: HTML CSS JavaScript 三大主流框架: VUE REACT Angular 深入学习: 小程序 Node jQuery TypeScript 前端工程化

    2024年01月20日
    浏览(45)
  • 一文带你吃透JSP,增删改查实战案例详细解读

    一文带你吃透JSP,增删改查实战案例详细解读

    不得不说,JSP 现在已经是一门十分老旧的技术了,学习编程时,不仅要学习优秀的前言技术,还要对基础有一定的把握,所以学习 JSP 时,我们只做了解,不用刨根问底花费大量的时间,得不偿失。 我们主要从以下几个方面学习 JSP 技术: 理解 JSP 及其原理 学会使用 EL 表达

    2024年02月03日
    浏览(39)
  • 【C++】一文带你吃透string的模拟实现 (万字详解)

    【C++】一文带你吃透string的模拟实现 (万字详解)

    (꒪ꇴ꒪(꒪ꇴ꒪ )🐣,我是 Scort 🎓 🌍博客主页:张小姐的猫~江湖背景 快上车🚘,握好方向盘跟我有一起打天下嘞! 送给自己的一句鸡汤🤔: 🔥真正的大师永远怀着一颗学徒的心 作者水平很有限,如果发现错误,可在评论区指正,感谢🙏 🎉🎉欢迎持续关注! 🎨传统写

    2024年02月03日
    浏览(46)
  • 如何使用JDBC操作数据库?一文带你吃透JDBC规范

    如何使用JDBC操作数据库?一文带你吃透JDBC规范

    大家好,我是橙子。最近又肝了几个大夜,总结了 JDBC 完整版的基础教程和实战案例训练。快来看看这些 Java 基础性的代码你有没有忘记? 在 Java 开发中,使用 Java 语言操作数据库是非常重要的一部分,那么 Java 语言是如何操作数据库的呢? 我们需要使用不同厂商的数据库

    2024年02月03日
    浏览(814)
  • 5、Spring_DI注解开发

    5、Spring_DI注解开发

    建立 mapper 建立 mapper 实现类 建立 service 建立 service 实现类 设置配置类 出现空指针异常 @Autowired按照类型注入 通过构造器注入 通过setter 方法注入 直接在属性上使用(是以后用得最多的) 注意:不提供setter 方法以及构造器是使用反射创建对象的 根据类型注入必须只有一个实现

    2024年02月11日
    浏览(14)
  • Spring使用注解进行对象装配(DI)

    Spring使用注解进行对象装配(DI)

    通过五大类注解可以更便捷的将对象存储到 Spring 中,同样也可以使用注解将已经储存的对象取出来,直接赋值到注解所在类的一个属性中,这一个过程也叫做对象的装配或者叫对象的注入,即 DI。 获取 Bean 对象也叫做对象装配,就是把对象取出来放到某个类中,有时候也叫

    2024年02月15日
    浏览(8)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包