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

Spring01——IOC

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

Spring01——IOC

IOC容器 什么是IOC:

控制反转,Inversion of Control。把对象得创建和对象之间的调用,交给Spring管理。
注:IOC是一种设计思想,而不是一个具体的技术实现。IOC 的思想就是将原本在程序中手动创建对象的控制权,交由 Spring 框架来管理。不过, IOC并非 Spirng 特有,在其他语言中也有应用。

IOC底层原理:

xml解析、工厂模式、反射

  • 解析xml文件,读取bean标签中class代表的路径,获取到bean对象的路径。
  • 通过工厂模式,getBean(),传入bean的id,通过反射创建bean对象实例,
  • 对bean的相关依赖进行注入,并返回。
IOC接口:

BeanFactory:IOC容器最基本的实现,是Spring内部使用接口。加载配置文件时,不会创建对象,在获取对象时,才会创建对象,scope = ’‘
ApplicationContext:BeanFactory接口的子接口,提供了更多更强大的功能,一般使用此接口。在加载配置文件时,默认创建时就创建对象。
ApplicationContext的实现类:

  • FileSystemXmlApplicationContext:通过文件绝对路径创建。
  • ClassPathXmlApplicationContext:通过文件完全限定名(包名 + 类名)创建。
IOC操作Bean管理(基于xml)

bean管理包括创建对象和注入属性。



	
	
	
	
    


DI:依赖注入,是IOC的一种具体实现。

使用set方法注入属性



    
        
    

使用有参构造注入属性
 



    
        
    

p名称空间注入,可简化xml配置


        
    
    

注入特殊值:null值、特殊符号
    
        
        
        
            
        
    
    
        
        
        
            ]]>
        
    
注入引用类型
    
    
        
    
可在注入引用类型时嵌套创建bean
    
        
        
        
            
                
            
        
    
注入集合属性:数组、list、map、set。

		
        
            
                java
                python
                javascript
            
        
		
        
            
                张三
                李四
            
        
     	
        
            
                
                
            
        
       	
        
            
                MYSQL
                REDIS
            
        
    
在集合中设置引用类型
    
        
    
    
        
    
    
	
        
            
                
                
            
        
    
提取集合注入部分



    
        123
        456
    

    
        
    


Spring有两种类型bean,一种是普通Bean,另一种是FactoryBean,
普通bean:定义类型就是返回类型。
工厂bean:在配置文件定义bean类型可以和返回类型不一样。需要继承FactoryBean,实现两个方法,getObject和getObjectType,getObject负责定义返回bean的类型,


bean声明周期管理,单例、多例

spring默认是单例模式,通过scope属性设置。
scope的值包括:singleton(单例)、prototype(多例),request(请求),session(会话)。
其中singleton的特点是,当加载spring配置文件时,就创建该单例对象。
而prototype的特点时,当获取bean时,调用getBean()方法时,才会创建对象。

如果使用set方法注入属性,则Bean的生命周期分为7步:

  • 调用无参数构造创建bean
  • 调用set方法设置值
  • 把bean的实例传给bean的后置处理器postProcessBeforeInitialization方法(需配置BeanPostProcessor)
  • 调用初始化方法(需配置init-method)
  • 把bean的实例传给bean的后置处理器postProcessAfterInitialization方法 (需配置BeanPostProcessor)
  • 获取到bean
  • 调用销毁方法(需配置destory-method,且手动销毁application.close())

如果使用有参构造器方法注入属性,则Bean的声明周期分为6步:

  • 调用有参构造创建Bean
  • 把bean的实例传给bean的后置处理器postProcessBeforeInitialization方法(需配置BeanPostProcessor)
  • 调用初始化方法(需配置init-method)
  • 把bean的实例传给bean的后置处理器postProcessAfterInitialization方法 (需配置BeanPostProcessor)
  • 获取到bean
  • 调用销毁方法(需配置destory-method,且手动销毁application.close())
package com.minghao.bean;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;

public class MyBeanPost implements BeanPostProcessor {
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("before init 方法");
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("after init 方法");
        return bean;
    }
}

配置了BeanPostProcessor,会对所有的Bean生效。

Bean自动装配

根据指定装配规则(属性名称或者属性类型),Spring自动将匹配的属性值进行注入。
Bean标签中有一个autowire属性,常用有两个值可选:byName,根据名称自动装配,byType,根据类型自动装配。

引入外部属性文件



    








    
        
        
        
        
    

prop.driverClassName=com.mysql.jdbc.Driver
prop.url=com.mysql.jdbc.Driver
prop.username=root
prop.password=xxxxxx
IOC操作Bean管理(基于注解)

@Component:创建普通Bean
@Service:用在业务逻辑层上,
@Controller:用在web层上
@Repository:用在Dao层(持久层上)
这四个注解功能是一样的,都可以创建Bean。

首先开启组件扫描




    

在类上加@Service

package com.minghao.service;

import org.springframework.stereotype.Service;

//value可以不写,默认是将列明首字母小写
@Service(value = "userService")
public class UserService {
    public void add(){
        System.out.println("userService add...");
    }
}

定制扫描注解




    


    
        
    


    
        
    

基于注解的注入属性

@AutoWire:
根据属性类型自动装配,
@Qualifier:
根据属性名称进行注入,和@AutoWire配合使用
@Resource:
可以根据类型注入,也可以根据名称注入,直接使用@Resource就是根据类型注入,@Resource(name = “Bean名称”)根据Bean名称注入
@Value(value = 值):
注入普通类型属性

全注解开发

创建配置类,代替xml配置文件,使用@Configuration,
配置组件扫描,使用@ComponentScan(basePackages = {“com.minghao”})
使用new AnnotationConfigApplicationContext(SpringConfig.class);创建applicationContext。

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

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

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