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

SpringIOC基本

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

SpringIOC基本

一、Spring的作用

1、轻量级:体积小,无侵入性;

2、主要作用:解耦;

3、控制反转:把创建对象的工作交由spring容器完成,创建对象即可赋值(DI依赖注入);

4、面向切面:在不改变原有业务逻辑的前提下,对业务进行曾强。

二、Spring架构体系

三、IOC流程 (一)通过set方法注入属性

1、创建普通maven工程

2、导入相关依赖:

        只需要导入spring-context包即可(等于导入了spring-beans和spring-core),本次使用的版本为5.2.10 RELEASE。

    
       org.springframework
       spring-context
       5.2.10.RELEASE
    

3、在resource中创建springContext.xml:

        按需导入spring相关配置,在文件头中可定义。




4、创建实体类:

        添加get、set和toString方法(为方便演示不使用lombok)。

package org.example.spring.bean;



public class Student {

    private String name;

    private String gender;

    private Integer age;
    
    public String getName() {
        return name;
    }

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

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public Integer getAge() {
        return age;
    }

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

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

5、将Student类交给spring容器管理并注入属性:

        在xml文件中如下定义:




    
    
        
        
        
        
        
    

 6、创建测试类:

        测试student属性是否注入成功:

package org.example.spring;

import org.example.spring.bean.Student;
import org.springframework.context.support.ClassPathXmlApplicationContext;


public class TestMain {
    public static void main(String[] args) {
        // 通过ClassPathXmlApplicationContext类读取xml配置
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("springContext.xml");
        // 通过context.getBean()方法得到spring容器内的对象,入参为在xml中定义的bean标签的id
        Student student = (Student)context.getBean("student");
        // 输出对象信息
        System.out.println(student);
    }
}

        输出内容:

        注意:实体类中必须要存在set方法,不然属性无法注入,会报错。

        原理:通过反射调用Student对象的set方法进行注入。

7、在对象中注入非基本类型的对象:

        在Student对象中增加如下字段并给set、get方法,并重新生成toString方法。

    private Date birth;

    public Date getBirth() {
        return birth;
    }

    public void setBirth(Date birth) {
        this.birth = birth;
    }

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

8、在springContext.xml文件中进行如下更改:

        详情见注释:




    
    
        
        
        
        
        
        
        
    
    
    

或者




    
    
        
        
        
        
        
        
        
            
            
        
    

9、自定义对象赋值与Date类赋值方式类似, 不再赘述,如下:

        - 定义Clazz对象:

        - Student持有Clazz对象: 

         - 修改xml文件(可提前赋值):

         - 输出:

10、对象注入集合类属性:

        - 实体类增加字段,set、get、toString等;

        - 修改xml文件如下:


    
        
        
        
        
        
        
        
        
        
            
                
                
                rap
                篮球
            
        
    
    
    

    
        
    

11、如果集合中不是存放的String等基本类型属性,那么xml文件如下:

        - 新建了Hobby类,Student持有List属性:

        
            
                
                
                
                    
                
            
        

或者

        
            
                
                
                
                
            
        

 12、Map类属性注入:

        - 在Student中持有Map属性;

        - xml中写法较多,可自行选择合适的写法,不完全展示如下:

        
            
                
                    
                
                
                    
                        h2
                    
                    
                
            
        

        - 输出:

(二)通过构造方法注入

通过(一)后,后面不再详细描述细节问题。

1、新建Book类,并添加全参构造方法。

package org.example.spring.bean;


public class Book {

    private String no;

    private Integer price;

    private Hobby hobby;

    public Book(String no, Integer price, Hobby hobby) {
        this.no = no;
        this.price = price;
        this.hobby = hobby;
    }

    @Override
    public String toString() {
        return "Book{" +
                "no='" + no + ''' +
                ", price=" + price +
                ", hobby=" + hobby +
                '}';
    }
}

 2、xml文件中,通过bean标签的constructor-args标签,完成属性注入,index属性需要按照构造方法入参的顺序从0开始。

        - 自定义对象的注入,可以去掉ref,将constructor-args变双标签,在里面加入bean标签,而后注入其属性。

    
        
        
        
    

3、输出

(三) Bean的作用域

        在获取bean的时候如果用contex.getBean的方式来获取对象,那么获取的对象均为同一个(默认单例模式),同时,spring容器在初始化的时候便会创建对象,即为饿汉模式(默认)。

        那么在xml中的bean标签内,可以用scope属性来定义,每次获取对象的时候是单例模式还是多例模式。

        - 单例模式(默认):singleton,每次获取对象实例均为同一个,可在bean标签内设置lazy-init = true属性来将饿汉模式变为懒汉模式,即用到该对象的时候才创建。

        - 多例模式:prototype,每次创建的实例不同,从而lazy-init变得没意义了,因为每次创建的对象都不同。

    
    
        
        
        
    

    
    
        
        
        
    

(四)Bean的生命周期方法

        在bean标签中的init-method属性可以指定一个方法作为该bean的初始化方法。该方法会在构造方法执行后执行。

        也可以再bean标签内设置destroy-method属性,指定一个方法作为bean的销毁方法,该方法会在bean销毁前执行。

    
    
        
        
        
    

(五)自动装配

        在bean标签中可以通过autowire属性,指定在bean实例化时通过何种方式来找到相应的实例来赋值到当前对象中,有以下两种方式:

        - byName:通过名称,假如下面的Book类中有一个属性为Hobby,那么在bean标签中定义autowire=byName后,相当于开启根据名称自动装配,在spring初始化时,会在容器中查找是否有名称相同的bean,如果有则注入到Book类的Hobby类中,使其实例化。(注意:开启自动装配,必须要提供对应属性的set方法,否则无法进行注入),如果名称对应的bean的类型和Book中的属性不是同一个类,无法注入,会报错。

        - byType:通过类型注入,综上所说,现在不根据名称在spring容器内查找了,会根据对应类型来查找并注入,但如果spring容器内同时存在两个相同类型的bean,会报错(因为它不知道要注入哪一个)。

    

    
        
        
        
    

四、spring IOC 注解配置 (一)定义xml文件



    
    
    
    

注意:开启ioc注解配置需要在xml的头中增加几个context相关的schema,否则无法开启。

(二)注解

@Component:

        将类交给spring管理,可在注解后指定bean的名称,不指定名称默认类名首字母小写。

@Component(value = "book")

@Controller、@Service、@Repository:

        以上三个的作用与Component的作用无异,区别在于语义上,好区分层级。这里不过多解释,Component则是声明除了这三个以外的类。

@Scope:

        加在类上,声明类是单例还是多例模式。在注解后括号中指定,值为singleton和prototype。

@Scope(value = "prototype")

@Lazy:

        开启懒汉模式,只用于单例模式,在注解后的括号中指定true或false。

@Lazy(value = true)

@PostConstruct:

        加在方法上,指定类的初始化方法。

    @PostConstruct
    public void start(){
        // 在构造方法执行后执行
    }

@PreDestroy:

        加在方法上,指定类的销毁方法。

    @PreDestroy
    public void end(){
        // 在类销毁前执行
    }

@AutoWired:

        加在类的属性上——自动装配,注入属性。默认根据类型(byType)注入。

        可在后面加上required = false,在匹配不到类型时,允许属性为null,不然无法注入则会npe异常。

        该注解也可放在set方法上,且必须是set方法。

    @Autowired(required = false)
    private BookService service;

@Qualifier("xxx")

        需要结合@Autowired一起使用,在后面可以写上bean的名字,指根据名称来注入(byName)。

    @Autowired(required = false)
    @Qualifier("bookService")
    private BookService service;

@Resource

        用法和作用同@Autowired。默认byName注入,如果根据名称找不到,则自动byType,如果两个都找不到,则会报错。

    @Resource
    private BookService service;

五、总结

        自此spring ioc的基本概念和用法总结完毕,没有过多讲原理概念类的东西。仅针对于用法。肯定还有遗漏的地方,后期发现再补。

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

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

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