Java开发那些事Java学习笔记Java技术升华

Spring的IOC控制反转

2018-03-15  本文已影响263人  林檎果

前置知识:

包含知识点

一些名词解释:

框架

封装了特定的流程,让程序员专注于业务逻辑

IOC和Bean容器

接口

沟通的中介物的抽象化,说明了对外的交互,隐藏具体实现。

面向接口编程

IOC

控制反转:应用程序不负责依赖对象的创建和维护,而是由外部容器负责创建和维护。Martin Fowler指出:“获得依赖对象的过程被反转了”依赖的管理由自身管理,变为IOC容器主动注入。在运行期间,动态的将依赖关系注入到对象里。
DI(依赖注入)是一种IOC的实现方式

  1. 找到IOC容器
  2. 容器返回对象
  3. 使用对象

在Spring中,IOC对象都叫做Bean,
<bean id="oneInterface" class="com.xxxx.XxxImpl"></bean>

IOC实现原理

IOC+DI

<bean id="userService" class="top.linxz.java.UserServiceImpl"> <!-- IOC -->
    <property name="name" value="李四"/> <!-- DI,不需要修改源码就注入了属性 --> 
</bean>

Bean

Bean实例化三种方式

Bean容器

Spring注入方式

注入是指在启动Spring容器加载bean配置的时候,完成对变量的赋值行为
常用两种:

<bean id="xxx" class="com.xxx.xxxImpl">
    <property name="injectionDAO" ref="injectionDAO"/> 
    <!--这个property就注入了下面那个bean-->
</bean>
<bean id="injectionDAO" class="com.xxx"></bean>
<bean id="xxx" class="com.xxx.xxxImpl">
    <constructor-arg name="injectionDAO" ref="injectionDAO"/> 
    <!--这个constructor-arg就在构造器里的对应参数里注入了下面那个bean-->
</bean>
<bean id="injectionDAO" class="com.xxx"></bean>

Bean专题

Bean配置项

Bean的作用域

Bean的生命周期

Aware接口

实现了Aware接口的bean初始化后可以获得相应资源

Bean的自动装配(Autowiring)

Bean装配的Resources

针对资源文件的统一接口

Bean的注解实现

classpath扫描和组件管理

使用Java注解定义Bean

元注解

如@Component可以用在一个注解上,

自动检测并注册Bean到ApplicationContext中

在XML配置通常用<context:component-scan base-package="org.example"/>包含了<context:annotation-config/>相当于启动注解。

使用过滤器自定义扫描

例子:把找出Stub和Repository并排除Respository

<beans>
<context:component-scan base-package="org.example">
    <context:include-filter type="regex" expression=".*Stub.*Repository" />
    <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository" />
</context:component-scan>
</beans>

定义Bean

@xxx("xxxx")显式设置bean名字,默认是类的小写开头

作用域

@Scope("xxx")选择你的scope

@Required

通常用于bean属性的setter方法,必须在配置时就被填入

@Autowired

可用在setter上,也可以用在构造器和成员变量。
如果失败会抛异常,但@Autowired(required=false)就不会

Spring类的注入

可以用在Spring自己的类,如BeanFactory,ApplicationContext,Environment,ResourceLoader

List、Set、Map的注入

@Autowired注入ListSetMap<String,x>的类,这里的String是Bean的ID,如果希望List中的Bean有序,可用@Order

Qualifier

多个实现类时,缩小@Autowired的查找范围,缩小查找的注解的名字,具体指定用哪个实现类

基于Java容器的注解

@Bean是XML配置Bean的java版。通常配合@Configuration使用

@Configuration
public class AppConfig{
    @Bean
    public MyService myService(){
        return new MyServiceImpl();
    }
}

等于

<beans>
    <bean id="myService" class="com.xxx.MyServiceImpl" />
</beans>

@ImportResource

@Configuration
@ImportResource("classpath:/com/acme/jdbc.properties")
public class AppConfig{
    @Value("${jdbc.url}")
    private String url;
    
    @Bean
    public DataSource dataSource(){
        return new DriverManagerDataSource(url)
    }
}

等于在XML

<beans>
    <context:property-placeholder location="classpath:/com/acme/jdbc.properties" />
    <bean class="com.xxx.DriverManagerDataSource">
        <property name="url" value="${jdbc.url}" />
    </bean>

参考

  1. Spring入门篇,moocer,https://www.imooc.com/learn/196

关于我:

linxinzhe,全栈工程师,目前供职于某500强通信企业。人工智能,区块链爱好者。

GitHub:https://github.com/linxinzhe

欢迎留言讨论,也欢迎关注我~
我也会关注你的哦!

上一篇 下一篇

猜你喜欢

热点阅读