Spring入门到精通二 ——Spring之IOC介绍

主要内容

  • 接口及面向接口编程
  • 什么是IOC
  • Spring的Bean配置
  • Bean的初始化
  • Spring的常用注入方式

一、什么是接口?

接口是用于沟通的中介物的抽象化。实体把自己提供给外界的一种抽象化说明,用以由内部操作分离出外部沟通方法,使其能被修改内部而不影响外界其他实体与其交互的方式。简单来说是这样的:接口是对外的一种说明,说明了我会提供哪些功能,至于内部的实现,对外是不公开的,比如说,我提供了注册的功能,你只需要告诉我你的手机号、密码等相关信息就可以直接注册,至于怎么注册、逻辑是什么、怎么判断、数据存储在哪里这些是对外不公开的,这就是接口。

Java里面有接口、抽象类、普通类;接口是只能有声明,不能能有实现,抽象类既可以有声明,又可以有实现,但是在Java8中,接口也可以拥有方法体,在某种程度上,接口和抽象类具有相同的功能。

二、面向接口编程

在程序的结构设计中,要分清层次及调用关系,每层只向外面提供(上层)提供一组功能接口,各层之间仅依赖接口而非实现类。这样做的好处是,接口实现的变动不影响各层之间的调用,这一点在公共服务中尤其重要。“面向接口编程”中的“接口”是用于隐藏具体实现和实现多态性的组件。

三、什么是IOC?

IOC即控制反转,控制权的转移,应用程序本身不负责依赖对象的创建和维护,而是由外部容器负责创建和维护。也就是说,当我们需要一个对象的时候,不是自己new来获得了,而是由外部容器来创建,我们从外部容器拿来或者申请一个来用。DI(依赖注入)其实是控制反转实现的一种方式,IOC的目的是创建对象,并且组装对象之间的依赖关系。

既然IOC是控制反转,那么到底是哪些方面的控制被反转了呢?答案是获得依赖对象的过程被反转了。控制被反转之后,获得依赖对象的过程由自身管理变为了由IOC容器自动注入。所谓依赖注入,就是由IOC容器在运行期间,动态的将某种依赖关系注入到对象之中。

四、Spring的Bean配置

Spring对Bean的配置有两种方式,第一是使用XML配置文件的方式,如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd 
        http://www.springframework.org/schema/context 
        http://www.springframework.org/schema/context/spring-context.xsd">

  <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"></bean>
</beans>

第二种是注解:

  1. @Configuration标注在类上,相当于把该类作为spring的xml配置文件中的<beans>
  2. @Bean标注在方法上(返回某个实例的方法),等价于spring的xml配置文件中的<bean>
  3. 可以使用@Component、@Controller、@Service、@Ripository等注解注册bean,当然需要配置@ComponentScan注解进行自动扫描
  4. 当接口存在两个实现类的时候必须使用@Qualifier指定注入哪个实现类,否则可以省略,只写@Autowired。

五、Bean容器初始化

——本地文件

FileSystemXmlApplicationContext context = new FileSystemXmlApplicationContext("F:/workspace/appcontext.xml");

——Classpath

ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring-context.xml");

——在Web应用中依赖servlet或者Listener

你可以象下面那样使用ContextLoaderListener来注册一个ApplicationContext:
<context-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>/WEB-INF/daoContext.xml /WEB-INF/applicationContext.xml</param-value>
</context-param>
<listener>
  <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<!-- 或者使用这个,不常用
<servlet>
  <servlet-name>context</servlet-name>
  <servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class>
  <load-on-startup>1</load-on-startup>
</servlet>
-->

六、Spring注入

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

常用的两种注入方式为设值注入、构造注入。

设值注入:

<?xml version="1.0" encoding="GBK"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://www.springframework.org/schema/beans"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
	http://www.springframework.org/schema/beans/spring-beans-4.0.xsd">

        <!-- 定义chinesePerson Bean实例,实现类Chinese类 -->
	<bean id="chinesePerson" class="com.mao.test.Chinese"></bean>

	<!-- 创建一个person Bean 实现类Person类-->
	<bean id="person" class="com.mao.test.Person">
	  <!-- 驱动调用person的setChinese()方法,将容器中的chinesePerson Bean实例作为传入参数 -->
	  <property name="chinese" ref="chinesePerson"></property>
	</bean>
</beans>

构造注入:


<?xml version="1.0" encoding="GBK"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://www.springframework.org/schema/beans"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
	http://www.springframework.org/schema/beans/spring-beans-4.0.xsd">

<bean id="roles" class="cn.com.ztz.spring.model.Roles">
	<constructor-arg value="1"/>
	<constructor-arg value="管理员"/>
	<constructor-arg ref="users"/>
</bean>

<bean id="users" class="cn.com.ztz.spring.model.Users">
	<constructor-arg value="2"/>
	<constructor-arg value="张三"/>
</bean>

</beans>

猜你喜欢

转载自blog.csdn.net/qq_21583077/article/details/86492795