Spring是一个开源免费的框架,为了解决企业应用开发的复杂性而建立。Spring框架是一个轻量级的解决方案,能够一站式地构建企业级应用。Spring是模块化的,因此能够只使用其中须要的部分。能够在任何web框架上使用控制反转(IoC),也能够只使用Hibernate集成代码或JDBC抽象层。它支持声明式事务管理、经过RMI或web服务实现远程访问,并可使用多种方式持久化数据。它提供了功能全面的MVC框架,能够透明地集成AOP到软件中。java
Spring被设计为非侵入式的,这意味着你的域逻辑代码一般不会依赖于框架自己。在集成层(好比数据访问层),会存在一些依赖同时依赖于数据访问技术和Spring,可是这些依赖能够很容易地从代码库中分离出来。web
Spring框架是基于Java平台的,它为开发Java应用提供了全方位的基础设施支持,而且它很好地处理了这些基础设施,因此你只须要关注你的应用自己便可。spring
Spring可使用POJO(普通的Java对象,plain old java objects)建立应用,而且能够将企业服务非侵入式地应用到POJO。这项功能适用于Java SE编程模型以及所有或部分的Java EE。数据库
一句话总结:Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器(框架)。编程
1.方便解耦,简化开发设计模式
2.AOP编程的支持安全
3.声明式事务的支持服务器
4.方便程序的测试架构
5.方便集成各类优秀框架app
6.下降Java EE API的使用难度
7.Java 源码是经典学习范例
Spring 框架是一个分层架构,由 7 个定义良好的模块组成。Spring 模块构建在核心容器之上,核心容器定义了建立、配置和管理 bean 的方式
组成 Spring 框架的每一个模块(或组件)均可以单独存在,或者与其余一个或多个模块联合实现。每一个模块的功能以下:
BeanFactory
,它是工厂模式的实现。BeanFactory
使用控制反转(IOC) 模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。Spring 框架的功能能够用在任何 J2EE 服务器中,大多数功能也适用于不受管理的环境。Spring 的核心要点是:支持不绑定到特定 J2EE 服务的可重用业务和数据访问对象。毫无疑问,这样的对象能够在不一样 J2EE 环境 (Web 或 EJB)、独立应用程序、测试环境之间重用。
Spring是一个开源的框架,如今的Spring框架构成了一个体系平台,经过Spring的官方网站http://www.springsource.org能够了解到,围绕着Spring框架自己,还有许多其余优秀的项目:
SpringFramework(Core):核心项目
Spring Web Flow:工做流项目
Spring Security:安全项目
Spring Batch:批量数据处理项目
Spring Android:Android系统支持项目
Spring Social:社交项目
最核心的 jar 包:
最核心的接口是 BeanFactory
,它用来描述 IOC 容器
它很干净,很纯粹,最主要的方法是 getBean
用来给调用方返回一个实例化好的对象。
在实际运用中,须要一些周边功能,好比加载资源/国际化/等等,Spring 为此提供了 ApplicatinContext
接口。它自己是 BeanFactory 的一个实现:
能够看到,ApplicationContext 除了实现了 BeanFactory,还实现了其余一些实用的接口。所以,它是在 Spring 中操做一切的核心。
这是门面模式的一种典型使用。
这种方式,充分利用了 xml 文件的优点:
因此,最开始的时候,描述工厂里 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:util="http://www.springframework.org/schema/util" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"> <bean id="bs" class="com.learning.spring.BookServiceImpl"></bean> </beans>
可是:
因此,就产生了不少其余的叛逆的想法
package com.learning.spring.configuration; import com.learning.spring.BookDAO; import com.learning.spring.BookService; import com.learning.spring.BookServiceImpl; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class SuibianSpringConfig { @Bean public BookService bs(){ System.out.println(bookDAO()); if(Math.random() > 0.5){ return new BookServiceImpl(); }else{ return new BookServiceImpl2(); } } @Bean public BookDAO bookDAO(){ return new BookDAO(); } }
Java Style 中混入 XML Style:
package com.learning.spring.configuration; import com.learning.spring.BookDAO; import com.learning.spring.BookService; import com.learning.spring.BookServiceImpl; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.ImportResource; @Configuration @ImportResource(locations = "learning/spring/my-spring.xml") public class SuibianSpringConfig2 { @Bean public BookService bs1() { System.out.println(bookDAO()); if(Math.random() > 0.5){ return new BookServiceImpl(); }else{ return new BookServiceImpl2(); } } @Bean public BookDAO bookDAO () { return new BookDAO(); } }
XML style 中混入 Java Style:
<?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:util="http://www.springframework.org/schema/util" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"> <bean id="bs" class="com.learning.spring.BookServiceImpl"></bean> <bean class="com.learning.spring.configuration.SuibianSpringConfig2" /> </beans>
建立应用对象之间协做关系的行为,一般称为装配 (Wiring)。这是依赖注入 (DI) 的本质。
装配的基础,是使用配置文件对 Bean 的关系进行声明。
总结起来,在 Spring 中,声明 Bean 一共有三种方式:
<bean />
节点@Bean
注解@Component/@Controller/@Service/@Repository
装配:
<?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:util="http://www.springframework.org/schema/util" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"> <!--有参构建--> <bean class="com.learning.components.Goal" id="goal"> <property name="name" value="多利"/> <property name="countOfLegs" value="4"/> <property name="aliases"> <ref bean="xx1"/> </property> </bean> <!--集合--> <util:list id="xx1"> <value>value1</value> <value>value2</value> <value>value3</value> </util:list> <!--设置别名--> <alias name="bookDAO" alias="bookDao"/> <alias name="bookDAO" alias="bookdao"/> <!--引入外部xml文件--> <import resource="dierge.xml"/> </beans>
另外:
Goal类代码以下:
package com.learning.components; import java.util.List; public class Goal { private String name; private int countOfLegs; private List<String> aliases; public List<String> getAliases() { return aliases; } @Override public String toString() { return "Goal{" + "name='" + name + '\'' + ", countOfLegs=" + countOfLegs + ", aliases=" + aliases + '}'; } public void setAliases(List<String> aliases) { this.aliases = aliases; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getCountOfLegs() { return countOfLegs; } public void setCountOfLegs(int countOfLegs) { this.countOfLegs = countOfLegs; } }
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:util="http://www.springframework.org/schema/util" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"> <bean id="bs" class="com.learning.spring.BookServiceImpl"></bean> <bean class="com.learning.spring.configuration.SuibianSpringConfig2" /> <!--有参构建--> <bean class="com.learning.components.Goal" id="goal"> <property name="name" value="多利"/> <property name="countOfLegs" value="4"/> <property name="aliases"> <ref bean="xx1"/> </property> </bean> <!--集合--> <util:list id="xx1"> <value>value1</value> <value>value2</value> <value>value3</value> </util:list> <!--设置别名--> <alias name="bookDAO" alias="bookDao"/> <alias name="bookDAO" alias="bookdao"/> <!--引入外部xml文件--> <import resource="dierge.xml"/> </beans>
Main类代码以下:
package com.learning.components; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Main { public static void main(String[] args) { ApplicationContext applicationContext = new ClassPathXmlApplicationContext("learning/spring/my-spring.xml"); Goal goal = (Goal) applicationContext.getBean("goal"); System.out.println(goal); } }
运行结果: