一、Spring组成
1、Spring Core模块
该模块是Spring的核心容器,它实现了IoC模式和Spring框架的基础功能。在模块中包含的最重要的BeanFactory类是Spring的核心类,负责配置与管理JavaBean。它采用了Factory模式上线了IoC容器,即依赖注入。
2、Context模块
该模块继承BeanFactory(或者说Spring核心)类,并且添加了事务处理、国际化、资源加载、透明加载、以及数据校验等功能。它还提供了框架式的Bean的访问和很多企业级的功能,如JNDI访问、支持EJB、远程调用、集成模板框架、E-mail和定时任务调度等。
3、AOP模块
Spring集成了所有AOP功能,通过事务管理可以将任意Spring管理的对象AOP化。Spring提供了用标准Java语言编写的AOP框架,其中大部分内容都是根据AOP联盟的API开发。它使应用程序抛开了EJB的复杂性,但拥有传统EJB的功能。
4、DAO模块
该模块提供了JDBC的抽象层,简化了数据库厂商的异常错误(不再从SQLException继承大批代码),大幅度减少了代码的编写并且提供了对声明式和编程式事务的支持。
5、ORM映射模块
该模块提供了对现有ORM框架的支持,各种流行的ORM框架已经非常成熟,并且拥有大规模的市场(如Hibernate)。Spring没有必要开发新的ORM工具,但是为Hibernate提供了完美的整合功能,并且支持其他ORM工具。
6、Web模块
该模块建立在Spring Context基础之上,提供了Servlet监听器的Context和Web应用的上下文,为现有的Web框架如JSF、Tapestry和Struts等提供了集成。
7、MVC模块
该模块建立在Spring核心功能之上,使其拥有Spring狂阿基的所有特性,从而能够适应多种多视图、模板技术、国际化和验证服务,实现控制逻辑和业务逻辑的清晰分离
使用BeanFactory管理Bean,加载Bean配置文件的代码如下:
Resource resource1 = new ClassPathResource("applicationContext.xml"); Resource resource2 = new FileSystemResource("applicationContext.xml"); BeanFactory factory = new XmlBeanFactory(resource1); Test test = (Test) factory.getBean("test");
应用ApplicationContext:
ApplicationContext接口有3个实现类,可以实例化其中任何一个来创建Spring的ApplicationContext容器
①ClassPathXMLApplicationContext类
ApplicationContext context = new ClassPathXmlApplicationContext(String configLocation);//configLocation:指定Spring配置文件的名称和位置
②FileSystemXmlApplicationContext类
ApplicationContext context = new FileSystemXmlApplicationContext(String configLocation);
③WebApplicationContext类
WebApplicationContext是Spring的Web应用容器,在Servlet中使用该类的方法,一是在Servlet的web.xml文件中配置Spring的ContextLoaderListener监听器;二是修改web.xml配置文件,在其中添加一个Servlet,定义使用Spring的org.springframework.web.contxt.ContextLoaderServlet类。
二、Spring IoC
1、依赖注入的3中实现类型,Spring支持后两种
①接口注入
该类型基于接口将调用的与实现分离,这种依赖注入方式必须实现容器所规定的接口。使程序代码和容器的API绑定在一起,这不是理想的依赖注入方式
②Setter注入
该类型基础JavaBean的setter()方法为属性赋值,在实际开发中得到了最广泛的应用
public class User{ private String name; public String getName(){ return name; } pubilc void setName(String name){ this.name = name; } }
③构造器注入
该类型基于构造方法为属性赋值,容器通过调用类的构造方法将其所需的依赖关系注入其中
public class User{ private String name; public User(String name){ this.name=name; } }
2、依赖注入配置
①Setter注入
public class User { private String name; private Integer age; private String sex; ... //省略的setter()和getter()方法 }
<bean id="user" class="entities.User" >
<property name="name" value="无语"/>
<property name="age" value="25" />
<property name="sex" value="男" />
</bean>
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); User user = (User) context.getBean("user"); System.out.println("name:"+user.getName()+"age:"+user.getAge()+"sex:"+user.getSex());
②、构造器注入
private String name; private Integer age; private String sex; public User(String name, Integer age, String sex) { this.name = name; this.age = age; this.sex = sex; } public void printlnInfo(){ System.out.println("name:"+name+"age:"+age+"sex:"+sex); }
<bean id="user" class="entities.User" >
<constructor-arg name="name" value="哈哈" />
<constructor-arg name="age" value="26" />
<constructor-arg name="sex" value="女" />
</bean>
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); User user = (User) context.getBean("user"); user.printlnInfo();