IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> chapter03-di-annotation(注解的方式注入) -> 正文阅读

[Java知识库]chapter03-di-annotation(注解的方式注入)

目录

使用注解的方式完成依赖注入

1.01、@Component:用在其余三层以外的注解

Stduent类

test.properties?

applicationContext.xml?

?MyTest

2.02、@Value:给简单类型的属性赋值

Student类

applicationContext.xml?

MyTest.java?

3.03、@Autowired:引用类型的自动注入

Student类

?School类

?4.04、若想要按名称注入byName,则需要加入注解@Qualifier(value =? "名称")完成按名称注入

Stduent类

School类

?5.05、关于@Autowired注解的required属性的值

Student类

School类

6.06、@Resource:先按名称(byName)完成注入,在按类型(byType)完成注入

Student类

School类?

?7.07如果想让@Resource注解只按名称注入,只需要使用其属性name = "值为bean的id值"

Stduent类

School类

8.xml文件

?applicationContext.xml

applicationContext-back.xml

?test.properties


-

使用注解的方式完成依赖注入

1.01、@Component:用在其余三层以外的注解

Stduent类

package edu.tjdz.ba01;

import org.springframework.stereotype.Component;

/**
 * @Component:创建对象的,等同于<bean>的功能
 *      属性:value 就是对象的名称,也就是<bean>的id值,
 *  *          value的值是唯一的,创建的对象在整个spring容器中就一个
 *  *      位置:在类的上面
 *
 * @Component(value = "myStudent")等同于
 *    <bean id="myStudent" class="edu.tjdz.ba01.Student" />
 *
 * spring中和@Component功能一致,创建对象的注解还有:
 *  1.@Repository(用在持久层类的上面):放在dao的实现类上面,dao对象是能访问数据库的。
 *  2.@Service(用在业务层类的上面):放在service的实现类上面,
 *             创建service对象,service对象是做业务处理的,可以有事务等功能的。
 *  3.@Controller(用在控制器上面):放在控制器(处理器)类的上面,创建控制器对象的,
 *             控制器对象,能够接受用户提交的参数,显示请求处理的结果。
 *  以上三个注解的使用语法和@Component一样的。都能创建对象,但是这三个注解还有额外的功能。
 *  @Repository,@Service,@Controller是给项目的对象分层的。
 */
//使用value属性,指定对象的名称
//@Component(value = "myStudent")

//省略value
@Component("myStudent")

//不指定对象的名称,由spring提供默认名称:类名的首字母小写
//@Component
public class Student {

    private String name;
    private Integer age;

    public Student() {
        System.out.println("Student`s not param start");
    }

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

    public void setAge(Integer age) {
        this.age = age;
    }

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

test.properties?

myname=王佳伟
myage=20

applicationContext.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">

    <!--声明组件扫描器(component-scan),组件就是java对象
        base-package:指定注解在你的项目中的包名
        component-scan工作方式:spring会扫描遍历base-package指定的包,
            把包中和子包中的所有类,找到类中的注解,按照注解的功能创建对象,或给属性赋值。

        加入了component-scan标签,配置文件的变化:
          1.加入一个新的约束文件spring-context.xsd
          2.给这个新的约束文件起个命名空间的名称
    -->
    <context:component-scan base-package="edu.tjdz.ba01" />

    <!--<bean id="myXueXiao" class="edu.tjdz.ba03.School">
        <property name="name" value="清华大学"/>
        <property name="address" value="北京市"/>
    </bean>-->

    <context:property-placeholder location="classpath:test.properties"/>

</beans>

?MyTest

package edu.tjdz;

import edu.tjdz.ba01.Student;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MyTest {

    @Test
    public void test01(){
        String config = "applicationContext.xml";
        ApplicationContext ctx = new ClassPathXmlApplicationContext(config);
        //从容器中获取对象
        Student student = (Student) ctx.getBean("myStudent");
        System.out.println("student="+student);
    }
}

2.02、@Value:给简单类型的属性赋值

Student类

package edu.tjdz.ba02;

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

@Component("myStudent")
public class Student {

    /**
     * @Value:简单类型的属性赋值
     *   属性:value 是String类型的,表示简单类型的属性值
     *   位置:1.在属性定义的上面,无需set方法,推荐使用。
     *        2.在set方法上面
     */
    @Value("张飞")
    private String name;
    private Integer age;

    public Student() {
        System.out.println("Student`s not param start");
    }

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

    @Value("30")
    public void setAge(Integer age) {
        System.out.println("setAge=="+age);
        this.age = age;
    }

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

applicationContext.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">

    <!--声明组件扫描器(component-scan),组件就是java对象
        base-package:指定注解在你的项目中的包名
        component-scan工作方式:spring会扫描遍历base-package指定的包,
            把包中和子包中的所有类,找到类中的注解,按照注解的功能创建对象,或给属性赋值。

        加入了component-scan标签,配置文件的变化:
          1.加入一个新的约束文件spring-context.xsd
          2.给这个新的约束文件起个命名空间的名称
    -->
    <context:component-scan base-package="edu.tjdz.ba01" />

    <!--<bean id="myXueXiao" class="edu.tjdz.ba03.School">
        <property name="name" value="清华大学"/>
        <property name="address" value="北京市"/>
    </bean>-->

    <context:property-placeholder location="classpath:test.properties"/>

</beans>

MyTest.java?

package edu.tjdz;

import edu.tjdz.ba02.Student;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MyTest02 {

    @Test
    public void test01(){
        String config = "applicationContext.xml";
        ApplicationContext ctx = new ClassPathXmlApplicationContext(config);
        //从容器中获取对象
        Student student = (Student) ctx.getBean("myStudent");
        System.out.println("student="+student);
    }
}

3.03、@Autowired:引用类型的自动注入

默认使用的是byType自动注入机制:

①:接口的实现

②:引用类型和bean的class值一样

③:引用类型数据和bean的class值是父子关系

Student类

package edu.tjdz.ba03;

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

@Component("myStudent")
public class Student {

    /**
     * @Value:简单类型的属性赋值
     *   属性:value 是String类型的,表示简单类型的属性值
     *   位置:1.在属性定义的上面,无需set方法,推荐使用。
     *        2.在set方法上面
     */
    @Value("张飞")
    private String name;
    private Integer age;


    /**
     * 引用类型
     * @Autowired:spring框架提供的注解,实现引用类型的赋值。
     * spring中通过注解给引用类型赋值,使用的是自动注入原则,支持byName,byType
     *
     * @Autowired:默认使用的是byType自动注入。
     *
     * 位置:1)在属性sing已的上面,无需set方法,推荐使用
     *      2)在set方法上面
     */
    @Autowired
    private School school;

    public Student() {
        System.out.println("Student`s not param start");
    }

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

    @Value("30")
    public void setAge(Integer age) {
        System.out.println("setAge=="+age);
        this.age = age;
    }

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

?School类

package edu.tjdz.ba03;

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

//@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 + '\'' +
                '}';
    }
}

?4.04、若想要按名称注入byName,则需要加入注解@Qualifier(value =? "名称")完成按名称注入

Stduent类

package edu.tjdz.ba04;

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

@Component("myStudent")
public class Student {

    /**
     * @Value:简单类型的属性赋值
     *   属性:value 是String类型的,表示简单类型的属性值
     *   位置:1.在属性定义的上面,无需set方法,推荐使用。
     *        2.在set方法上面
     */
    @Value("张飞")
    private String name;
    private Integer age;


    /**
     * 引用类型
     * @Autowired:spring框架提供的注解,实现引用类型的赋值。
     * spring中通过注解给引用类型赋值,使用的是自动注入原则,支持byName,byType
     *
     * @Autowired:默认使用的是byType自动注入。
     *
     * 位置:1)在属性sing已的上面,无需set方法,推荐使用
     *      2)在set方法上面
     *
     *   如果要使用byName方式,需要做的是:
     *    1.在属性上面加入@Autowired
     *    2.在属性的上面加入@Qualifier(value="bean的id"):表示使用指定名称的bean完成赋值
     */

    //byName自动注入
    @Autowired
    @Qualifier("mySchool")
    private School school;

    public Student() {
        System.out.println("Student`s not param start");
    }

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

    @Value("30")
    public void setAge(Integer age) {
        System.out.println("setAge=="+age);
        this.age = age;
    }

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

School类

package edu.tjdz.ba04;

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

@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 + '\'' +
                '}';
    }
}

?5.05、关于@Autowired注解的required属性的值

required的值为一个布尔值

当它 的值是true的时候:表示引用类型赋值失败的时候,程序报错,终止执行。

当值为false时:表示程序引用类型赋值失败的时候,程序正常执行,引用类型为null

Student类

package edu.tjdz.ba05;

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

@Component("myStudent")
public class Student {

    /**
     * @Value:简单类型的属性赋值
     *   属性:value 是String类型的,表示简单类型的属性值
     *   位置:1.在属性定义的上面,无需set方法,推荐使用。
     *        2.在set方法上面
     */
    @Value("张飞")
    private String name;
    private Integer age;


    /**
     * 引用类型
     * @Autowired:spring框架提供的注解,实现引用类型的赋值。
     * spring中通过注解给引用类型赋值,使用的是自动注入原则,支持byName,byType
     * @Autowired:默认使用的是byType自动注入。
     *
     *  属性:required,是一个boolean类型的,默认是true
     *      required=true:表示引用类型赋值失败,程序报错,终止执行
     *      required=false:引用类型如果赋值失败,程序正常执行,引用类型是null
     *
     * 位置:1)在属性sing已的上面,无需set方法,推荐使用
     *      2)在set方法上面
     *
     *   如果要使用byName方式,需要做的是:
     *    1.在属性上面加入@Autowired
     *    2.在属性的上面加入@Qualifier(value="bean的id"):表示使用指定名称的bean完成赋值
     */

    //byName自动注入
    @Autowired(required = true)
    @Qualifier("mySchool-1")
    private School school;

    public Student() {
        System.out.println("Student`s not param start");
    }

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

    @Value("30")
    public void setAge(Integer age) {
        System.out.println("setAge=="+age);
        this.age = age;
    }

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

School类

package edu.tjdz.ba05;

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

@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 + '\'' +
                '}';
    }
}

6.06、@Resource:先按名称(byName)完成注入,在按类型(byType)完成注入

Student类

package edu.tjdz.ba06;

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

import javax.annotation.Resource;


@Component("myStudent")
public class Student {

    @Value("张飞")
    private String name;
    private Integer age;

    /**
     * 引用类型
     * @Resource:来自JDK的注解,Spring框架提供了对这个注解的功能支持,可以使用它给引用类型赋值
     *           使用的也是自动注入原则,支持byName,byType,默认byName
     *   位置:1.在属性定义上面,无需set方法,推荐使用。
     *        2.在set方法上面
     *
     */
    //默认是byName:先使用byName自动注入,如果byName赋值失败,在使用byType
    @Resource
    private School school;

    public Student() {
        System.out.println("Student`s not param start");
    }

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

    @Value("30")
    public void setAge(Integer age) {
        System.out.println("setAge=="+age);
        this.age = age;
    }

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

School类?

package edu.tjdz.ba06;

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

@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 + '\'' +
                '}';
    }
}

?

?7.07如果想让@Resource注解只按名称注入,只需要使用其属性name = "值为bean的id值"

Stduent类

package edu.tjdz.ba07;

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

import javax.annotation.Resource;


@Component("myStudent")
public class Student {

    //@Value("张飞")
    @Value("${myname}")
    private String name;
    @Value("${myage}")
    private Integer age;

    /**
     * 引用类型
     * @Resource:来自JDK的注解,Spring框架提供了对这个注解的功能支持,可以使用它给引用类型赋值
     *           使用的也是自动注入原则,支持byName,byType,默认byName
     *   位置:1.在属性定义上面,无需set方法,推荐使用。
     *        2.在set方法上面
     *
     * @Resource:只能使用byName的方式,需要增加一个属性 name
     *  name的值是bean的id
     *
     */
    @Resource(name = "mySchool")
    private School school;

    public Student() {
        System.out.println("Student`s not param start");
    }

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

    public void setAge(Integer age) {
        System.out.println("setAge=="+age);
        this.age = age;
    }

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

School类

package edu.tjdz.ba07;

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

@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 + '\'' +
                '}';
    }
}

8.xml文件

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

    <!--声明组件扫描器(component-scan),组件就是java对象
        base-package:指定注解在你的项目中的包名
        component-scan工作方式:spring会扫描遍历base-package指定的包,
            把包中和子包中的所有类,找到类中的注解,按照注解的功能创建对象,或给属性赋值。

        加入了component-scan标签,配置文件的变化:
          1.加入一个新的约束文件spring-context.xsd
          2.给这个新的约束文件起个命名空间的名称
    -->
    <context:component-scan base-package="edu.tjdz.ba01" />

    <!--<bean id="myXueXiao" class="edu.tjdz.ba03.School">
        <property name="name" value="清华大学"/>
        <property name="address" value="北京市"/>
    </bean>-->

    <context:property-placeholder location="classpath:test.properties"/>

</beans>

applicationContext-back.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">

    <!--声明组件扫描器(component-scan),组件就是java对象
        base-package:指定注解在你的项目中的包名
        component-scan工作方式:spring会扫描遍历base-package指定的包,
            把包中和子包中的所有类,找到类中的注解,按照注解的功能创建对象,或给属性赋值。

        加入了component-scan标签,配置文件的变化:
          1.加入一个新的约束文件spring-context.xsd
          2.给这个新的约束文件起个命名空间的名称
    -->
    <context:component-scan base-package="edu.tjdz.ba01" />

    <!--指定多个包的三种方式-->
    <!--第一种方式:使用多次组件扫描器,指定不同的包-->
    <context:component-scan base-package="edu.tjdz.ba01" />
    <context:component-scan base-package="edu.tjdz.ba02" />

    <!--第二种方式:使用分隔符(;或,分割多个包)-->
    <context:component-scan base-package="edu.tjdz.ba01;edu.tjdz.ba02" />

    <!--第三种方式:指定父包-->
    <context:component-scan base-package="edu.tjdz"/>

</beans>

?test.properties

myname=王佳伟
myage=20

?

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-11-22 12:12:16  更:2021-11-22 12:14:05 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 2:31:03-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码