Spring之IOC小结

IOC简介

由spring来负责控制对象的生命周期和对象间的关系。传统的程序开发中,在一个对象中,如果要使用另外的对象自己new一个,使用完之后还要将对象销毁,对象始终会和其他的接口或类藕合起来。

Spring中所有的类都会在spring容器中登记,spring会在系统运行的时候,把你要的东西主动给你,同时也把你交给其他需要你的东西。所有的类的创建、销毁都由spring来控制,也就是说控制对象生存周期的不再是引用它的对象,而是spring。对于某个对象而言,以前是它控制其他对象,现在是所有对象都被spring控制,所以这叫控制反转。

IoC的一个重点是在系统运行中,动态的向某个对象提供它所需要的其他对象。这一点是通过DI(Dependency Injection,依赖注入)来实现的。比如对象A需要操作数据库,以前我们总是要在A中自己编写代码来获得一个Connection对象,有了spring我们就只需要告诉spring,A中需要一个Connection,A不需要知道Connection怎么构造,何时构造。系统运行时,spring会在适当的时候制造一个Connection,注射到A当中,这样就完成了对各个对象之间关系的控制。A需要依赖Connection才能正常运行,而这个Connection是由spring注入到A中的,依赖注入的名字就这么来的。

Java 1.3之后一个重要特征是反射(reflection),它允许程序在运行的时候动态的生成对象、执行对象的方法、改变对象的属性,spring就是通过反射来实现注入的。

Spring中所有配置在xml中或使用spring来初始化的都叫Bean(dao,service,javaBean,Controller...)。

Bean容器的初始化
两个基础包:
org.springframework.beans
org.springframework.context
BeanFactory提供配置结构和基本功能,加载并初始化Bean
ApplicationContext保存了Bean对象并在spring中被广泛使用

在webapp中的我们一般配置到web.xml文件中

<!-- 配置contextConfigLocation指定spring将要使用的配置文件 -->
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>classpath:action.xml,classpath:dao.xml,classpath:service.xml</param-value>
	</context-param>
<!--  配置listner让spring读取配置文件-->
	<listener>
         <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

	<servlet>
		<servlet-name>remoting</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>classpath:spring-remoting-servlet.xml</param-value>
		</init-param> 	
<!-- load-on-startup标签指定启动顺序,1为指在启动服务器的时候初始化容器 -->
		<load-on-startup>1</load-on-startup>
    </servlet>

Bean容器的注解实现

Classpath扫描与组件管理,类的自动检测与注册Bean ,<context:annotation-config/>

classpath扫描与组件管理

@Component是Spring中的一个通用注解,可以用于任何Bean,相当于注解的超类,如果不知道位于那个层,一般使用该注解
@Controller通常用于注解Controller,即控制层(MVC)
@Service,通常用于追注解Service类,即业务层
@Repository,通常用于注解DAO,即持久层的注解
@Value,注入基本数据类型和String类型数据的
@Scope,指定bean的作用范围
@PostConstruct,指定某个方法为初始化方法
@PreDestory,指定某个方法为销毁方法
@Bean,该注解只能写在方法上,将方法的返回值作为一个bean,并且放入spring容器

类的自动检测与注册Bean
xml下配置如下标签,可以指定某个包路劲,扫描该包以及子包下,
使用了spring注解的bean注册哦容器中,basp-package指向扫描那个包下的注解类
<!-- 配置注解扫描的包:声明到指定的包下去进行扫描,如果发现类上有对应的注解,将其装配到容器中 -->
<context:component-scan base-package="com.demon"/>

还可用<context:annotation-config/>标签
不过context:component-scan包含context:annotation-config的全部功能,通常使用context:component-scan。
context:component-scan一般用于基于类的注解(包括成员变量或成员方法的注解),context:annotation-config只能在完成bean注册后,去处理bean类中的成员变量或成员方法的注解。

@Autowired
这个注解相当于在xml文件中配置的autowire="constructor/byName/byType",只不过我们这里使用@Autowired方式注解方式,
且默认是通过类型判断,意思就是不使用byName,和construtor。通过@Autowired注解,spring会自动去容器中查找对应的类型,
注入到该属性中,且bean类中,使用@Autowired注解其属性,我们可以不用提供getter,setter方法

猜你喜欢

转载自blog.csdn.net/weixin_42679286/article/details/87523596