【spring mvc (三)】spring 容器
来源:互联网 发布:淘宝购物并发技术 编辑:程序博客网 时间:2024/05/16 16:58
1.spring容器的作用:
spring容器本质是一个上下文,是我们编写的应用的环境。为什么要使用这个上下文?传统上我们写a调用b的f方法肯定是在a类的方法中new一个b的对象,在用b的f方法,这样写的问题主要是增加了a,b的耦合,具体体现在,a本来是调用b的方法,但是它必须事先new一个b,new一个b意味着要得知b的另一个接口(本来只要知道f),现在又要知道b的创建接口(构造方法),潜在的问题是如果b的构造接口发生改变,那么会影响到a的代码。比如原来是构造方法,现在改成了工厂方法。
那么如何改进呢?我们不让a来new一个b,而是为这个调用的情景创建一个上下文,在上下文中完成调用。那么就会成为下面的:
class c{function f(){ A a = new A(); B b = new B(); a.setB(b); a.ff();}}这不是标准的java代码。上下文便是C类,c类负责创建实例,并且组装,把b的实例给了a,这样a只管用b就行,不用在担心b的创建了。最终把耦合性带到了C类中。
当然,不足之处在于上下文C还得由我们在掌控。Spring容器所做的工作与C类相同,只不过它要复杂的多,它便是为我们的应用创建了一个不用我们维护的上下文(当然能需要初始化容器内的实例了,其它的是衣来伸手饭来张口。有要用的就拿),在容器内部缓存了很多的实例,我们要用那个,只需要调用这个实例的方法即可,并不用关心创建过程。
2.加载:
在web。xml文件中,通过、
<listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>listener来初始化容器,ContextLoaderListener是一个类,创建spring容器,这个过程挺复杂,《spring技术内幕》一书讲的很详细。
3.bean:
默认的spring容器配置文件是applicationContext.xml,实际上是定义了容器内要存储的对象。
每一个对象都用bean标签定义。
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd" xmlns:p="http://www.springframework.org/schema/p"> <!-- 定义一个bean --> <bean id="bean1" class="com.model.Person"> <!-- 为bean注入属性或者依赖 --> <!-- 如果是基本类型,用value标签 --> <property name="age"><value>12</value></property> <property name="name"><value>liyao</value></property> <!-- 如果是引用类型,用ref标签 --> <property name="address"><ref bean="bean2"></ref></property> </bean> <bean id="bean2" class="com.model.Address"> <!-- 为bean注入属性或者依赖 --> <property name="address"><value>白云小区</value></property> </bean> <!-- 使用p命名空间 --> <bean id="bean3" class="com.model.Address" p:address="狄村"/> <!-- bean scope --> <bean id="bean4" class="com.model.Car" scope="prototype"> </bean> <bean id="bean5" class="com.model.Car"> </bean></beans>这便是一个例子。
最上面的xmlns声明一个xml文档的命名空间,比如要用p:xxx就要提前声明p命名空间,mvc:也同理。xsi命名空间是指定了其他命名空间的文档。
*每一个bean的id必须唯一,作为标识;
*注入bean的属性时,可以用property标签定义,这是set注入方式,比较推荐着一种。也可以引入p标签,定义起来更方便,需要命名空间。
*bean有一个scope如果是prototype,每次都会new一个新的,如果是单例的,就返回相同的对象,默认单例。
以上是使用xml方式配置bean。
更方便的是使用注解方式,需要在spring-mvc配置文件中加入扫描包的启动注解的配置。
可以用@Component来定一个一个bean。为了更好的理解有@Service@Controller@Resource三个标签,分别标识service层组件,controller组件和dao组件。
如果要使用一个bean,那么可以在声明的上方用@Autowired,返回spring容器中唯一的这个类型的实例,如果有多个,必须再加:
@Autowired@Qualifier("dao")只用一个都不行。
使用注解的方式更加方便,加快开发进度,但是可能可读性不如xml方式。
package com.test;import javax.servlet.ServletContext;import javax.servlet.http.HttpServletRequest;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Qualifier;import org.springframework.context.ApplicationContext;import org.springframework.context.support.FileSystemXmlApplicationContext;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import com.beans.BigCar;import com.model.Address;import com.model.Car;import com.model.Person;@Controllerpublic class TestController {@Qualifier("bean5")private Car car;@AutowiredBigCar gc;@RequestMapping(value="/index")public String index(HttpServletRequest request){ServletContext servletContext = request.getServletContext();String path = servletContext.getRealPath("/WEB-INF/config/");System.out.println(path);ApplicationContext a = new FileSystemXmlApplicationContext(path+"/spring.xml");Address address = (Address) a.getBean("bean2");System.out.println(address.getAddress());Person person = (Person) a.getBean("bean1");System.out.println(person.getAge());System.out.println(person.getName());Address address2 = (Address) a.getBean("bean3");System.out.println(address2.getAddress());Car car1 = (Car) a.getBean("bean4");System.out.println(car1.getCount());Car car2 = (Car) a.getBean("bean5");System.out.println(car2.getCount());//BigCar gc = (BigCar) a.getBean("bean6");//System.out.println(gc.getPerson().getAddress());gc.getClass();System.out.println(gc.getDao());System.out.println(gc.getAddress());return "index";}}
- 【spring mvc (三)】spring 容器
- web 容器(Spring MVC)
- spring mvc (三)
- Spring学习(三):初探Spring容器
- spring容器归纳(三)
- spring 容器与 spring mvc 容器
- Spring MVC学习(三)
- Spring MVC视图(三)
- web容器,spring容器,MVC容器介绍
- 三、Spring 容器概述
- Spring MVC 容器加载原理
- Spring MVC上下文父子容器
- spring-mvc之ioc容器
- 深入分析Spring 与 Spring MVC容器
- 深入分析Spring 与 Spring MVC容器
- 深入分析Spring 与 Spring MVC容器
- 深入分析Spring 与 Spring MVC容器
- 深入分析Spring 与 Spring MVC容器
- jsp性能优化
- 缓存技术PK:选择Memcached还是Redis?
- 综述及分析:无线传感器网络的分析及启示
- Win7+虚拟机OS X 10.11.3+Xcode7.0.1+未越狱iPhone4+iOS7.1.2真机调试及生成ipa包(2016-1-22 19:09)
- 如何删除AD RMS根认证的方法
- 【spring mvc (三)】spring 容器
- SQL Server 创建链接服务器
- 使用baksmali和smali反编译和编译apk
- [LeetCode] Odd Even Linked List
- hdu4251The Famous ICPC Team Again【划分树入门题】
- Android------Intent用法大全
- HDU 2147 kiki's game
- 实际项目中关于java常量宏替换的实际问题
- MSSQL和MYSQL数据交互