Spring实用IOC总结

Spring实用IOC总结

Spring实用IOC总结

1.IOC(Inverse Of Control)思想

IOC(控制反转)相当于一个容器,这个容器里面放你想放的对象或者要用到的对象。IOC思想产生的一个主要原因就是为了解耦。这里首先说一下程序之间的耦合,如果没有IOC,使用mvc架构层与层之间通过new相互实例化,如果依赖类过多,导致的结果就是程序里面相当混乱。无疑提高了维护成本。引入IOC的目的就是为了解耦,将依赖关系通过配置文件或者注解的方式进行实例化并且管理起来,并通过类之间的相互注入实现类于类之间的数据传递,相互调用等。

2. Bean

在介绍spring之前首先解释一下java里面的Bean的含义,在英语里Bean是豆子的意思,在java里是译为可重用组件。说白了也可以理解为一个类。

3.两个重要的接口以及实现类

先来看一张图:
在这里插入图片描述

两个重要的接口

1). 作用
通过 diagram 可以看到 ApplicationContext和BeanFactory是最主要的两个接口类。ApplicationContext extends了6个接口,而BeanFactory是最顶层的接口。因此相对而言BeanFactory的功能要简单一些,而ApplicationContext扩展的功能要多一些。
这两个接口的实例化对象主要完成的工作就是创建容器和对于Bean的实例化。

2). 不同点
两者的不同点在于:

BeanFactory属于延迟加载,也就是系统启动后并不完成类的实例化,而是在使用的时候getBean()对象了再加载。
ApplicationContext
属于系统启动时就加载。
另外两者的不同之处还在于,ApplicationContext获取到得对象一般是单例模式而BeanFactory的实例化是多例的。
说完接口,下面说一下重要的实现类。通过比较两个接口的不同点,我们就明白了为什么我们更多使用ApplicationContext这个接口,他是单例模式的,消耗的资源更少一些,而功能有更多一些。

3)接口方法
getBean 从Spring容器中获取Bean对象。
参数可以使用三种情况:

getBean(“id”) 使用bean的id从容器中查找对象
getBean(Bean.class) 使用bean的class类型从容器中查找对象
getBean(“id”, Bean.class) 使用bean的id 和 class类型从容器中查找对象

实现类

ApplicationContext的主要实现类包括
ClassPathXmlApplicationContext:加载类路径下的配置文件
在这里插入图片描述

FileSystemXmlApplicationContext:可以加载磁盘任意路径下的配置文件
在这里插入图片描述
AnnotationConfigApplicationContext:用于注解创建容器
在这里插入图片描述

4. 创建bean的三种方式(XML)

对于bean的创建。spring提供了三种不同方式,

  1. 使用默认构造函数创建
    通过id和class属性创建,且没有其他属性和标签时,但是如果没有默认构造函数则不能通过这种方式创建。
 <bean id="accountSevice" class="service.AccoutService" scope="singleton" init-method="init" destroy-method="destroy"></bean>

2.使用普通工厂中的方法创建对象

public class FactoryIns {

    public IAccoutService getFactoryIns (){
        return new AccoutService();
    }
}
  <bean id="instanceFactory" class="service.FactoryIns"></bean>
  <bean id="accountSevice" factory-bean="instanceFactory" factory-method="getFactoryIns"></bean>

以上配置的作用是实例化FactoryIns类,通过执行类中的getFactoryIns方法。

3.通过静态工厂创建对象


public class StaicFactoryIns {

    public static IAccoutService getFactoryIns (){
        return new AccoutService();
    }
}
<bean id="accountSevice" class="service.StaicFactoryIns" factory-method="getFactoryIns" ></bean>

因为是静态方法则直接执行类中的getFactoryIns方法即可。

5.Bean的作用范围

通过在bean中设置scope属性来设置Bean的作用范围
其中作用范围包括:
singleton:单例模式
prototype:多例模式,每次获取bean的时候,IOC 都给我们创建一个新对象
request:在一个web应用的request域中的作用范围
session:在一个web应用的会话范围内
GlobalSession:集群范围的session,理解为集群范围的session共享

6.依赖注入

** 1. 能够注入的数据类型主要包括**,
1).基本类型和String类型
2) .实例化的bean
3) .复杂类型 list、set、map等

2.注入方式

** 构造函数注入**
前提是Bean中有该构造函数,如果没有则无法注入

        <bean id="accountSevice" class="service.AccoutService" scope="singleton"
              init-method="init" destroy-method="destroy">
            <constructor-arg name="name" value="abc"> </constructor-arg>
            <constructor-arg name="id" value="1"> </constructor-arg>
            <constructor-arg name="date" ref="now"> </constructor-arg>
        </bean>
        <bean id="now" class="java.util.Date"></bean>
    </beans>

Set注入
set注入是最常用的一种注入方式他的属性主要是property属性,
ref:用于指定其他的Bean类型数据。他指的就是Srping的IOC核心容器中出现过的bean

    <bean id="accountSevice" class="service.AccoutServiceSet" scope="singleton"
          init-method="init" destroy-method="destroy"
    >
        <property name="dao" ref="accoutDao"></property>
 </bean>
    <bean id="accoutDao" class="dao.AccoutDao"></bean>

7.注解方式配置

xml的配置都有对应的注解方式创建bean和注入bean。省去了繁琐的配置问题。

使用注解首先要从xml中配置扫描类所在的路径通过

 <context:component-scan base-package="service"></context:component-scan>-->

创建Bean的注解主要有
@Component后续spring有根据mvc的方式,为了使用起来更易读,做了几个Component的别名注解包括
@Controller :用于Controller层使用
@Service用于Service层使用
@ Repository 用于Dao层使用
为了更清晰看到以上说明spring源码情况如下Controller的spring源码

在这里插入图片描述

@Scope
@Scope用于指定bean的作用范围(单例和多例),相当于配置文件中的< bean scope="">

@Scope用于指定bean的作用范围(单例和多例),相当于配置文件中的< bean scope="">
@Scope(“prototype”) //多例
@Scope(“singleton”) //单例

注解注入

@Autowired
放在属性上:可以注入Bean
表示先按照类型给属性注入值,如果存在多个相同类型的注入,则通过具体的名称找到相关的Bean,该注解可以与@Qualifier注解混合使用。@Qualifier的作用是指定相应的类名称

@Resource注解则相当于@Autowired+@Qualifier

取值
@Value
可以通过spring的el表达式从配置文件中获取相应id的值
一般用于解析其它properties配置文件中的key值俩获取对应的value,写法如下:
@Value("${key}")

@Configuration
用于指定当前类是一个 spring配置类,当创建容器时会从该类上加载注解。

@Bean
@Bean注解一般用在有Configuration的注解的配置文件当中,主要用于将一个创建一个对象并加入到springIOC容器中它支持一个name属性,用于给生成的bean取一个id。
一般用在方法上。

@ComponentScan
与XML配置文件的

 <context:component-scan base-package="service"></context:component-scan>

类似,即扫描文件下的注解。

@Import
在一个配置类中,引入其他配置,具体写法:@Import(DaoConfig.class)
效果等于之前xml配置中的

@PostConstruct @PreDestroy
@PostConstruct @PreDestroy 这两个注解标注方法分别在对象的创建之后和销毁之前执行。
相当于< bean init-method=“init” destroy-method=“destory” />

@PropertySource
用于加载.properties 文件中的配置。例如我们配置数据源时,可以把连接数据库的信息写到properties 配置
文件中,就可以使用此注解指定 properties 配置文件的位置。

最后:

这是最近学习spring的一些总结,欢迎批评指正。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值