spring——控制反转

像前面博客中提到struts框架,Hibernate框架似的,spring同样也是一个开源的框架。使用框架的的优势在于分层结构,每层有相应的框架,减少开发工作量,减少组件之间的耦合。struts框架应用web层,Hibernate框架应用持久层,spring应用两者之间。

我觉得,框架是出于聪明的赖人之手。聪明是说他们开发封装每层框架,把复杂的操作全部封装在框架中。而赖人是说他所有复杂的操作实现全部交给计算机来实现,减少人们的开发工作量,把工作的注意力集中在业务逻辑上。

那我们来介绍一下struts框架。

spring框架是一个开源的轻量级的基于IOCAOP核心技术的容器框架,主要是解决企业的复杂操作实现。

IOCAOP,到底如何解释呢,在看spring视频中,两个专业术语一定必须要懂得。

IOCinverse of Control:控制反转。意思是程序中的之间的关系,不用代码控制,而完全是由容器来控制。在运行阶段,容器会根据配置信息直接把他们的关系注入到组件中。同样,这也是依赖注入的含义。依赖注入和控制反转其实是一个概念。只不过强调的不同而已,依赖注入强调关系的注入是由容器在运行时完成,而控制反转强调关系是由容器控制。其实本质是一样的。

用代码演示一下控制反转是如何实现的。

1。新建一个普通的java项目。

2。引入相应的jar包。Spring.jar,log4j-1.2.14.jar(提供日志功能的),commons-logging.jar

3。提供log4j.properties配置文件。(日志jar包可以不用添加)

4。提供配置文件ApplicationContext.xml文件

5。开始写代码。

package ioc.iocsample;
/**
 * 学校类
 * @author lhy
 *
 */
public class School {
   private String name;
   public School(String name)
   {
	   this.name=name;
   }
   public void printInfo()
   {
	   System.out.println("该学校的名称是:"+name);
   }
}
package ioc.iocsample;
/**
 * 学生类
 * @author lhy
 *
 */
public class Student {
  public int id;
  public String name;
  private School school;
public int getId() {
	return id;
}
public void setId(int id) {
	this.id = id;
}
public String getName() {
	return name;
}
public void setName(String name) {
	this.name = name;
}
public School getSchool() {
	return school;
}
public void setSchool(School school) {
	this.school = school;
}  
}


配置文件:

<?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:aop="http://www.springframework.org/schema/aop"
	     xmlns:tx="http://www.springframework.org/schema/tx"
	     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">
 <bean id="school" class="ioc.iocsample.School">
	   <constructor-arg index="0">
	     <value>廊坊师院</value>
	   </constructor-arg>
 </bean>
 <bean id="student" class="ioc.iocsample.Student">
	 <property name="id"      value="001"/>
	 <property name="name" value="张三"/>
	 <property name="school"  ref ="school"/>
 </bean>
</beans>


客户端进行测试,其中学生类Student中有School中的引用,测试该学生就读的学校的名称如下:

package ioc.iocsample;

import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Client {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext.xml");
		Student student=(Student)factory.getBean("student");
		student.getSchool().printInfo();
	}
}


其中,在程序中不用实例化学生类,学校类,直接由容器中的beanFactory直接创建,隐藏了创建了细节。同时,程序中也不用关心学生类与学校类之间的依赖关系,而由容器来进行负责,在运行的时候,容器会把属性值及依赖关系注入学生类和学校类中的javabean中(其实在此School和Student就是一个javaBean。javaBean就是一个按照一定的原则封装的java类而已。)

其中依赖注入包括两种:一种赋值注入(使用getter和setter方法);另一种使用构造器注入。

看程序中student中的ID,name都是使用get,set来赋值的:那在配置文件是如下配置:

<property name="id" value="001"/>
<property name="name" value="张三"/>

并且Student中的school属性是School类型,则在容器中是如下配置的:

<property name="school" ref ="school"/>

而在程序中的School中的name是构造器赋值的,则容器中是如下配置的:

<constructor-arg index="0">
<value>廊坊师院</value>
</constructor-arg>

构造器中一个参数,则索引值是从0开始,若是有多个,依次递增。

若构造器中的是一个类,则使用bean标签

<constructor-arg index="0">

<bean class="具体的类">

</constructor-arg>

PS:当再次看博客,有了新的感触。2012年8月7日 15:06:52

spring中的依赖注入DI(dependence injection)共有三种方式:第一种是接口注入(Interface Injection)第二种是get set注入(set/get Injection)第三种是构造器注入(Constructor Injection)

三种注入方式的区别:

1.接口注入:组件需要依赖特定接口的实现,其中的加载接口实现和接口实现的具体对象都是由容器来完成。这样,接口必须依赖容器,这样的组件具有侵入性,降低了重用性。其中如J2EE开发中常用的Context.lookup(ServletContext.getXXX),都是接口注入的表现形式。(这种注入方式不是常用的)

2.getter/setter方式注入:对于需要注入的东西比较明确。符合java的设计规则。更适合java开发人员,使用起来更加自然,更加方便。

3.构造器方式注入:在类加载的时候,就已经注入依赖的组件。但是若是参数多的话,使用起来不方便。

但是后两种注入方式是spring常用的,而第一种接口注入方式不常用。

### Spring - context 概述 Spring - context 是 Spring 框架的核心模块之一,它提供了依赖注入(DI)和控制反转(IoC)容器的支持,以及其他企业级服务,如事件传播、资源加载、国际化等。 ### 功能介绍 - **依赖注入和 IoC 容器**:Spring - context 实现了强大的 IoC 容器,它负责创建和管理对象(Bean),并通过依赖注入的方式将对象之间的依赖关系进行解耦。例如,可以通过 XML 配置、Java 注解或 Java 配置类来定义 Bean 及其依赖关系。 ```xml <!-- XML 配置示例 --> <bean id="userService" class="com.example.UserService"> <property name="userRepository" ref="userRepository"/> </bean> <bean id="userRepository" class="com.example.UserRepository"/> ``` ```java // Java 注解示例 import org.springframework.stereotype.Service; import org.springframework.beans.factory.annotation.Autowired; @Service public class UserService { private UserRepository userRepository; @Autowired public UserService(UserRepository userRepository) { this.userRepository = userRepository; } } ``` - **事件机制**:Spring - context 提供了事件传播机制,允许应用程序中的组件发布和监听事件。这有助于实现松耦合的组件通信。例如,当用户注册成功后,可以发布一个用户注册事件,其他组件可以监听该事件并执行相应的操作。 ```java import org.springframework.context.ApplicationEvent; // 自定义事件类 public class UserRegisteredEvent extends ApplicationEvent { public UserRegisteredEvent(Object source) { super(source); } } import org.springframework.context.ApplicationListener; import org.springframework.stereotype.Component; // 事件监听器 @Component public class UserRegisteredListener implements ApplicationListener<UserRegisteredEvent> { @Override public void onApplicationEvent(UserRegisteredEvent event) { // 处理用户注册事件 } } ``` - **资源加载**:Spring - context 提供了统一的资源加载接口 `ResourceLoader`,可以方便地加载各种类型的资源,如文件、类路径资源、URL 资源等。 ```java import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.core.io.Resource; public class ResourceLoadingExample { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); Resource resource = context.getResource("classpath:config.properties"); // 处理资源 } } ``` - **国际化支持**:Spring - context 支持国际化(i18n),可以根据用户的语言环境提供不同的文本信息。通过配置消息源和使用 `MessageSource` 接口,可以轻松实现国际化功能。 ```xml <!-- 配置消息源 --> <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"> <property name="basename" value="messages"/> </bean> ``` ```java import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class InternationalizationExample { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); String message = context.getMessage("welcome.message", null, java.util.Locale.ENGLISH); System.out.println(message); } } ``` ### 使用指南 1. **添加依赖**:如果使用 Maven 项目,在 `pom.xml` 中添加 Spring - context 依赖。 ```xml <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.3.23</version> </dependency> ``` 2. **配置 Bean**:可以使用 XML 配置、Java 注解或 Java 配置类来定义和配置 Bean。 3. **启动 Spring 容器**:根据配置方式的不同,使用相应的方式启动 Spring 容器。 ```java import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Main { public static void main(String[] args) { // 启动 XML 配置的 Spring 容器 ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); // 获取 Bean UserService userService = context.getBean(UserService.class); // 使用 Bean userService.doSomething(); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值