Spring框架从入门到入土(三):Spring之基于注解的DI(依赖注入)

Spring框架从入门到入土(三):Spring之基于注解的DI(依赖注入)

注解的使用步骤:

  1. 加入maven的依赖,spring-context,在你加入spring-context的同时,间接加入了spring-aop的依赖。使用注解必须使用aop依赖。
  2. 在类中加入spring的注解(多个不同功能的注解)
  3. 在spring的配置文件中,加入一个组件扫描标签,说明注解在你项目中的位置。

定义Bean的注解@Comptent

@Component 创建对象的,等同于<bean>的功能
属性:value就是对象的名称,也就是bean的id值
value的值是唯一的,创建的对象在整个spring容器中就一个
位置:在类的上面

举例子:

  1. 创建Student类
package com.liar.ba01;

import org.springframework.stereotype.Component;

/**
 * @author liar
 * @date 编写时间: 2022/3/23 12:58
 *
 * @Component 创建对象的,等同于<bean>的功能
 * 属性:value就是对象的名称,也就是bean的id值
 *      value的值是唯一的,创建的对象在整个spring容器中就一个
 * 位置:在类的上面
 *
 */
@Component(value = "myStudent")
public class Student {
    private String name;
    private Integer age;

    public Student() {

    }

    public Student(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

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

    public Integer getAge() {
        return age;
    }

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

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
  1. 声明组件
<?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">


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

      加入了component-scan标签,配置文件的变化:
      1. 加入了一个新的约束文件spring-context.xsd
      2. 给这个新的约束文件起个命名空间的名称

    -->
    <context:component-scan base-package="com.liar.ba01"/>
</beans>
  1. 测试方法
    @Test
    public void test01(){
        String config = "applicationContext.xml";
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(config);
        //从容器中获取对象
        Student student = (Student) context.getBean("myStudent");
        //使用对象
        System.out.println(student);
    }

多注解分层

注解的写法:

//正统写法
@Component(value = "myStudent")
//省略写法
@Component("myStudent")
//默认不指定对象,由spring提供默认名称:类名的首字母小写
@Component
* spring中和@Component的功能一致,创建对象的注解还有:
* 1. @Repository(用在持久层上):放在dao的实现类上面,表示创建dao对象,dao对象是能访问数据库的。
* 2. @Service (用在业务层上):放在service的实现类上面,创建service对象,service对象是做业务处理的,有处理事务的功能。
* 3. @Controller(用在控制器的上面):放在控制器(处理器)类的上面,创建控制器对象,控制器对象,能够接受用户提交的参数,显示请求的处理结果。
*
* 以上三个注解的用法和Component一样的,但是这三个注解还有额外的功能
* @Repository,@Service,@Controller  是用来给项目的对象分层的

扫描多个包的方式

<!--指定多个包的三种方式-->
<!--第一种:使用多次组件扫描器,指定不同的包-->
<context:component-scan base-package="com.liar.ba01"/>
<context:component-scan base-package="com.liar.ba02"/>
<!--第二种:使用分隔符(;或者,)分隔多个包-->
<context:component-scan base-package="com.liar.ba01;com.liar.ba02"/>
<!--第三种:指定父包-->
<context:component-scan base-package="com.liar"/>

简单的类型属性注入@Value

    /**
     * @Value:简单类型的属性赋值
     * 属性:value是String类型的,表示简单类型的属性值
     * 位置:1. 在属性定义上面,无需set方法
     *      2. 在set方法上面
     */
    @Value(value = "张三")
    private String name;
    @Value(value = "18")
    private Integer age;
    @Value(value = "18")
    public void setAge(Integer age) {
        this.age = age;
    }

引用类型@Autowired

byType自动注入@Autowired

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

byName自动注入@Autowired和@Qualifier

  • 如果要使用byName,需要做的是
    1. 在属性上面加入@Autowired
    2. 在属性上面加上@Qualifier(value = “bean的id”):表示要用指定名称的bean完成赋值
   //这两个注解没有先后顺序
    @Autowired
    @Qualifier(value = "mySchool")
    private School school;

引用类型Autowired的required属性

是一个布尔类型,默认是true

required=true:表示引用类型赋值失败,程序报错,并终止执行。

required=false:表示引用类型赋值失败,程序正常执行,引用类型是一个null。

推荐使用true,保证引用类型都是赋值成功的,会把问题尽早地暴露!!!

JDK注解@Resource自动注入

    /**
     * @Resource 来自jdk的注解,spring框架提供了对这个注解的功能支持,可以使他给引用类型赋值
     *           使用的也是jdk自动注入原理,支持byName、buType,默认是byName
     * 位置:1. 在属性定义的上面,无需set方法,推荐使用
     *      2. 在set方法上面
     *      
     * 先使用byName注入,如果byName失败,再使用byType
     */
    @Resource
    private School school;
  • 如果只使用byName方式,需要增加一个属性值name
    @Resource(name = "mySchool")
    private School school;

使用${}解耦合

  1. 写配置文件
myName = 张三
myAge = 李四
  1. 配置路径
    <context:property-placeholder location="xxxxxxxxxxxx"/>
  1. 引用
    @Value(value = "${myNAme}")
    private String name;
    @Value(value = "$)
    private Integer age;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值