栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Spring框架入门(二)---IoC

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Spring框架入门(二)---IoC

目录

第二章、IoC控制反转

2.5 基于注解的DI实现

2.5.1 介绍及注解的使用步骤

2.5.2 @Component

2.5.3 组件扫描器

2.5.4 扫描多个包的方式

2.5.5 @Value:简单类型的属性赋值

2.5.6 @Autowired:引用类型的属性赋值(来自Spring)

2.5.7 @Resource:引用类型的属性赋值(来自JDK)

2.5.8 利用配置文件来属性赋值

2.5.9 注解与XML文件的对比


第二章、IoC控制反转

2.5 基于注解的DI实现

2.5.1 介绍及注解的使用步骤

   对于DI使用注解,将不再需要在Spring配置文件中声明bean标签。Spring中使用注解,需要在原有的Spring运行环境基础上再做一些改变。

   使用注解的步骤:

        ①在pom.xml文件中加入依赖spring-context,在加入spring-context的同时,间接加入spring-

          aop的依赖,使用注解必须使用spring-aop依赖。

        ②创建类,在类中加入spring的注解(多个不同功能的注解)。

        ③在spring的配置文件中,加入一个组件扫描器的标签,说明注解在你的项目中的位置。

        ④使用注解创建对象,创建容器ApplicationContext。

   学习的注解:

        ①@Component

        ②@Repository

        ③@Service

        ④@Controller

        ⑤@Value

        ⑥@Autowired

        ⑦@Resource

2.5.2 @Component
package com.bjpowernode.ba01;

import org.springframework.stereotype.Component;


//使用value属性,指定对象名称
//@Component(value = "myStudent")
//省略value(公司中常用的方式)
@Component("myStudent")

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

    private String name;
    private Integer age;

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

    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 +
                '}';
    }
}
public class MyTest01 {

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

2.5.3 组件扫描器

需要在Spring配置文件中配置组件扫描器,用于在指定的基本包中扫描注解。

        ApplicationContext.xml:





    
    
    

2.5.4 扫描多个包的方式

   ①第一种方式:使用多次组件扫描器,指定不同的包。

   ②第二种方式:使用分隔符";"或","来分隔多个包。

   ③第三种方式:指定父包。




    
    
    
    

    
    

    
    

2.5.5 @Value:简单类型的属性赋值
@Component("myStudent")
public class Student {

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

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

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

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

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

2.5.6 @Autowired:引用类型的属性赋值(来自Spring)

   1.byType方式的自动注入:

@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 + ''' +
                '}';
    }
}
@Component("myStudent")
public class Student {

    @Value("张飞")
    private String name;
    @Value("29")
    private Integer age;
    
    @Autowired
    private School school;

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


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

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

   2.byName方式的自动注入:

@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 + ''' +
                '}';
    }
}
@Component("myStudent")
public class Student {

    @Value("xxy")
    private String name;
    @Value("22")
    private Integer age;
    
    //两个注解没有先后顺序ba04
    @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 MyTest04 {

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

   3.@Autowired的require属性:默认情况下为true。推荐设置为true。

@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 + ''' +
                '}';
    }
}
@Component("myStudent")
public class Student {

    @Value("许潇杨")
    private String name;
    @Value("22")
    private Integer age;
    
    //两个注解没有先后顺序ba04
    @Autowired(required = false)
    @Qualifier("mySchool-1")
    private School school;

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


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

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

2.5.7 @Resource:引用类型的属性赋值(来自JDK)
@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 + ''' +
                '}';
    }
}
@Component("myStudent")
public class Student {

    @Value("许潇杨")
    private String name;
    @Value("22")
    private Integer age;
    
    //默认是byName:先使用byName自动注入,如果byName赋值失败,再使用byType
    @Resource
    private School school;

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


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

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

   @Resource只使用byName方式:

@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 + ''' +
                '}';
    }
}
@Component("myStudent")
public class Student {

    @Value("许潇杨")
    private String name;
    @Value("22")
    private Integer age;
    
    //只使用byName
    @Resource(name = "mySchool")
    private School school;

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


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

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

2.5.8 利用配置文件来属性赋值

test.properties:

myname=xxy

myage=22




    
    

    
    

@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 + ''' +
                '}';
    }
}
@Component("myStudent")
public class Student {

    //@Value("许潇杨")
    @Value("${myname}")
    private String name;
    //@Value("22")
    @Value("${myage}")
    private Integer age;
    
    @Resource
    private School school;

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


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

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

2.5.9 注解与XML文件的对比

   注解:

        优点:方便、直观、高效(代码少,没有配置文件的书写那么复杂)

        缺点:以硬编码的形式写入到java代码中,修改是需要重新编译代码的。

   XML文件:

        优点:配置和代码是分离的;在xml中做修改,无需重新编译代码,只需重启服务器即可将新

      的配置加载。

        缺点:编写麻烦、效率低、大型项目过于复杂。

PS:根据动力节点课程整理,如有侵权,联系删除。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/390384.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号