Spring

Spring框架学习01

一.Spring简介

1. Spring介绍

  • Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson创建。简单来说,Spring是一个分层的JavaSE/EEfull-stack(一站式) 轻量级开源框架。

2. Spring作用

  • Spring致力于提供一种方法管理你的业务对象。

  • Spring的主要目的是使JavaEE易用和促进好编程习惯。

  • Spring致力于J2EE应用的各层的解决方案,而不是仅仅专注于某一层的方案。可以说Spring是企业应用开发的“一站式”选择,并贯穿表现层、业务层及持久层。然而,Spring并不想取代那些已有的框架,而是与它们无缝地整合。

3. Spring起源

  • Spring的出现是为了取代EJB(Enterprise JavaBean)的臃肿、低效、脱离现实的特点。

  • 传统J2EE应用的开发效率低,应用服务器厂商对各种技术的支持并没有真正统一,导致J2EE的应用没有真正实现Write Once及Run Anywhere的承诺。Spring作为开源的中间件,独立于各种应用服务器,甚至无须应用服务器的支持,也能提供应用服务器的功能,如声明式事务、事务处理等。

4. Spring体系结构

  • Spring 框架是一个分层架构,它包含一系列的功能要素并被分为大约20个模块。这些模块分为Core Container、Data Access/Integration、Web、AOP(Aspect Oriented Programming)、Instrumentation和测试部分,如下图所示:

[外链图片转存失败(img-8mrmvDXY-1563700644055)(C:\Users\CX\AppData\Roaming\Typora\typora-user-images\1556118635467.png)]

1. 核心容器(Core Container)
  1. Core和Beans模块提供了Spring最基础的功能,提供IoC(控制反转)和DI(依赖注入)特性。这里的基础概念是BeanFactory,它提供对Factory模式的经典实现来消除对程序性单例模式的需要,并真正地允许你从程序逻辑中分离出依赖关系和配置。
  2. Context模块基于Core和Beans来构建,它提供了用一种框架风格的方式来访问对象,有些像JNDI注册表。Context封装包继承了beans包的功能,还增加了国际化(I18N),事件传播,资源装载,以及透明创建上下文,例如通过servlet容器,以及对大量JavaEE特性的支持,如EJB、JMX。核心接口是ApplicationContext。
  3. Expression Language,表达式语言模块,提供了在运行期间查询和操作对象图的强大能力。支持访问和修改属性值,方法调用,支持访问及修改数组、容器和索引器,命名变量,支持算数和逻辑运算,支持从Spring 容器获取Bean,它也支持列表投影、选择和一般的列表聚合等。
2. 数据访问/集成部分(Data Access/Integration)
  1. JDBC模块,提供对JDBC的抽象,它可消除冗长的JDBC编码和解析数据库厂商特有的错误代码。
  2. ORM模块,提供了常用的"对象/关系"映射API的集成层。 其中包括JPA、JDO、Hibernate 和 iBatis 。利用ORM封装包,可以混合使用所有Spring提供的特性进行"对象/关系"映射,如简单声明性 事务管理 。
  3. OXM模块,提供一个支持Object和XML进行映射的抽象层,其中包括JAXB、Castor、XMLBeans、JiBX和XStream。
  4. JMS模块,提供一套"消息生产者、消费者"模板用于更加简单的使用JMS,JMS用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。
  5. Transaction模块,支持程序通过简单声明性 事务管理,只要是Spring管理对象都能得到Spring管理事务的好处,即使是POJO,也可以为他们提供事务。
3. Web
  1. Web-Socket模块, WebSocket protocol 是HTML5一种新的协议。它实现了浏览器与服务器全双工通信,spring支持webSocket通信。
  2. Web模块,提供了基础的web功能。例如多文件上传、集成IoC容器、远程过程访问、以及Web Service支持,并提供一个RestTemplate类来提供方便的Restful services访问
  3. Web-Servlet模块,提供了Web应用的Model-View-Controller(MVC)实现。Spring MVC框架提供了基于注解的请求资源注入、更简单的数据绑定、数据验证等及一套非常易用的JSP标签,完全无缝与Spring其他技术协作。
  4. Web-Portlet模块,提供了在Portlet环境下的MVC实现
  5. spring本身提供springmvc
4. AOP
  1. AOP模块,提供了符合AOP 联盟规范的面向方面的编程实现,让你可以定义如方法拦截器和切入点,从逻辑上讲,可以减弱代码的功能耦合,清晰的被分离开。而且,利用源码级的元数据功能,还可以将各种行为信息合并到你的代码中 。
  2. Aspects模块,提供了对AspectJ的集成。
  3. Instrumentation模块, 提供一些类级的工具支持和ClassLoader级的实现,可以在一些特定的应用服务器中使用
5. Test
  • Test模块,提供对使用JUnit和TestNG来测试Spring组件的支持,它提供一致的ApplicationContexts并缓存这些上下文,它还能提供一些mock对象,使得你可以独立的测试代码。

5.Spring优点

  • 方便解耦,简化开发
    • Spring就是一个大工厂,可以将所有对象创建和依赖关系维护,交给Spring管理
  • AOP编程的支持
    • Spring提供面向切面编程,可以方便的实现对程序进行权限拦截、运行监控等功能
  • 声明式事务的支持
    • 只需要通过配置就可以完成对事务的管理,而无需手动编程
  • 方便程序的测试
    • Spring对Junit4支持,可以通过注解方便的测试Spring程序
  • 方便集成各种优秀框架
    • Spring不排斥各种优秀的开源框架,其内部提供了对各种优秀框架(如:Struts、Hibernate、MyBatis、Quartz等)的直接支持
  • 降低JavaEE API的使用难度
    • Spring 对JavaEE开发中非常难用的一些API(JDBC、JavaMail、远程调用等),都提供了封装,使这些API应用难度大大降低

二.IOC控制反转和DI依赖注入

  • 简单来说,就是将原来由我们实例化的对象,交由spring框架来进行实例化.这是对象的实例化的权利就会反转.

  • IOC 的思想是:用框架的方式替代耦合度高的 new 构造方法();的形式创建对象

    这样可以在需要的时候去创建,不需要的时候销毁, 统一管理, 节约资源, 提高效率

  • DI 的思想是:Spring框架替我们完成属性赋值的操作

一.配置版

1.pom.xml配置spring依赖
   <dependency>
      <groupId>org.springframeworkgroupId>
      <artifactId>spring-beansartifactId>
      <version>4.2.5.RELEASEversion>
    dependency>
    <dependency>
      <groupId>org.springframeworkgroupId>
      <artifactId>spring-contextartifactId>
      <version>4.2.5.RELEASEversion>
    dependency>
    <dependency>
      <groupId>org.springframeworkgroupId>
      <artifactId>spring-coreartifactId>
      <version>4.2.5.RELEASEversion>
    dependency>
   <dependency>
      <groupId>org.springframeworkgroupId>
      <artifactId>spring-testartifactId>
      <version>4.2.5.RELEASEversion>
    dependency>
2.applicationContext.xml

<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="service" class="com.kgc.service.ToursService">
        
        <property name="dao" ref="dao"/>
    bean>
    
    <bean id="dao" class="com.kgc.dao.ToursDaoImpl">bean>
beans>
3.Service实现类
public class ToursService {
    private IToursDao dao;
//配置版需要提供set方法
   public IToursDao getDao() {
        return dao;
    }

    public void setDao(IToursDao dao) {
        this.dao = dao;
    }
  //调用dao的add方法
    public void add(Toursinfo tours){
       dao.add(tours);
    }
}
4.Dao实现类
public class ToursDaoImpl implements IToursDao {

    @Override
    public void add(Toursinfo tours) {
        System.out.println("模拟实现新增");
        System.out.println(tours);
    }
}
5.Web测试类
public class TestSpring {
    @Test
    public void test1(){
        //1.加载spring配置文件
       ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
       //2.实例化service这个bean 
       ToursService service = (ToursService) context.getBean("service");
        Toursinfo t = new Toursinfo();
        t.setIntroduce("魅力中国");
        //3.调用add方法
        service.add(t);
    }
}

二.注解版

  1. 注解的原理和配置xml中的bean标签,property标签是相同的,注解的本质就是封装好的方法的调用。

  2. 类的注解相当于在xml中配置bean标签,利用反射的原理实例化对象

  3. 属性的注解相当于xml中配置property标签,借助反射实现为属性赋值。

  4. 使用属性注解不需要提供set方法

1.类的注解有四个:
  • 通用型:@Component

  • Dao层:@Repository

  • Service层:@Service

  • Web层:@Controller

2.属性的注解有两个
  • @value 简单数据类型
  • @Autowired 引用数据类型
3.补充:
  • @Autowired它默认是根据类型进行注入
@Value("tom")
    private String name;

@Autowired
    private IToursService service;
  • 如果与@Qualifier注解一起使用,就可以根据名称来进行注入
 	@Autowired
    @Qualifier("service")
    private IToursService service;
  • 我们也可以使用下面的方式来根据名称进行属性注入
@Resource(name="service")
private IToursService service;

演示

1.service层
@Service
public class ToursService implements IToursService {
    
    @Autowired
    private IToursDao dao;

    @Override
    public void add(Toursinfo tours) {
        dao.add(tours);
    }
    
}
2.dao层
@Repository
public class ToursDaoImpl implements IToursDao {
    @Override
    public void add(Toursinfo tours) {
        System.out.println("模拟实现新增");
        System.out.println(tours);
    }
}
3.applicationContext配置文件
  • 注解版的配置文件需要在约束中添加 context 约束

  • 需要开启注解扫描–让注解生效

    
     <context:component-scan base-package="com.kgc"/>
    
4.测试类
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("/applicationContext.xml")
public class TestSpring {

   @Autowired
    private IToursService service;

    @Value("tom")
    private String name;
    
    @Test
    public void test2(){
        Toursinfo t = new Toursinfo();
        t.setIntroduce("魅力中国");

        service.add(t);
        System.out.println(name);
    }
   
}

你可能感兴趣的:(Spring)