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提供了三种不同方式,
- 使用默认构造函数创建
通过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的一些总结,欢迎批评指正。