Spring框架入门--loc的两种实现方式

Spring框架01

一、spring简介
1、spring的作用

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

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

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

2、spring体系结构

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

1、核心容器(Core Container)

Core和Beans模块提供了Spring最基础的功能,提供IoC(控制反转)和DI(依赖注入)特性。这里的基础概念是BeanFactory,它提供对Factory模式的经典实现来消除对程序性单例模式的需要,并真正地允许你从程序逻辑中分离出依赖关系和配置。

Context模块基于Core和Beans来构建,它提供了用一种框架风格的方式来访问对象,有些像JNDI注册表。Context封装包继承了beans包的功能,还增加了国际化(I18N),事件传播,资源装载,以及透明创建上下文,例如通过servlet容器,以及对大量JavaEE特性的支持,如EJB、JMX。核心接口是ApplicationContext。

Expression Language,表达式语言模块,提供了在运行期间查询和操作对象图的强大能力。支持访问和修改属性值,方法调用,支持访问及修改数组、容器和索引器,命名变量,支持算数和逻辑运算,支持从Spring 容器获取Bean,它也支持列表投影、选择和一般的列表聚合等。

2、数据访问/集成部分(Data Access/Integration)

JDBC模块,提供对JDBC的抽象,它可消除冗长的JDBC编码和解析数据库厂商特有的错误代码。

ORM模块,提供了常用的"对象/关系"映射API的集成层。 其中包括JPA、JDO、Hibernate 和 iBatis 。利用ORM封装包,可以混合使用所有Spring提供的特性进行"对象/关系"映射,如简单声明性事务管理 。

OXM模块,提供一个支持Object和XML进行映射的抽象层,其中包括JAXB、Castor、XMLBeans、JiBX和XStream。

JMS模块,提供一套"消息生产者、消费者"模板用于更加简单的使用JMS,JMS用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。

Transaction模块,支持程序通过简单声明性事务管理,只要是Spring管理对象都能得到Spring管理事务的好处,即使是POJO,也可以为他们提供事务。

3、Web

Web-Socket模块, WebSocket protocol 是HTML5一种新的协议。它实现了浏览器与服务器全双工通信,spring支持webSocket通信。

Web模块,提供了基础的web功能。例如多文件上传、集成IoC容器、远程过程访问、以及Web Service支持,并提供一个RestTemplate类来提供方便的Restful services访问

Web-Servlet模块,提供了Web应用的Model-View-Controller(MVC)实现。Spring MVC框架提供了基于注解的请求资源注入、更简单的数据绑定、数据验证等及一套非常易用的JSP标签,完全无缝与Spring其他技术协作。

Web-Portlet模块,提供了在Portlet环境下的MVC实现

spring本身提供springmvc

4、AOP

AOP模块,提供了符合AOP 联盟规范的面向方面的编程实现,让你可以定义如方法拦截器和切入点,从逻辑上讲,可以减弱代码的功能耦合,清晰的被分离开。而且,利用源码级的元数据功能,还可以将各种行为信息合并到你的代码中 。

Aspects模块,提供了对AspectJ的集成。

Instrumentation模块, 提供一些类级的工具支持和ClassLoader级的实现,可以在一些特定的应用服务器中使用。

5、Test

Test模块,提供对使用JUnit和TestNG来测试Spring组件的支持,它提供一致的ApplicationContexts并缓存这些上下文,它还能提供一些mock对象,使得你可以独立的测试代码。

3、spring的优点
  • 方便解耦,简化开发
    Spring就是一个大工厂,可以将所有对象创建和依赖关系维护,交给Spring管理
  • AOP编程的支持
    Spring提供面向切面编程,可以方便的实现对程序进行权限拦截、运行监控等功能
  • 声明式事务的支持
    只需要通过配置就可以完成对事务的管理,而无需手动编程
  • 方便程序的测试
    Spring对Junit4支持,可以通过注解方便的测试Spring程序
  • 方便集成各种优秀框架
    Spring不排斥各种优秀的开源框架,其内部提供了对各种优秀框架(如:Struts、Hibernate、MyBatis、Quartz等)的直接支持
  • 降低JavaEE API的使用难度
    Spring 对JavaEE开发中非常难用的一些API(JDBC、JavaMail、远程调用等)都提供了封装,使这些API应用难度大大降低
二、IOC控制反转和DI依赖注入
  • IOC 的思想是:用框架的方式替代耦合度高的 new 构造方法();的形式创建对象,这样可以在需要的时候去创建,不需要的时候 统一管理、 销毁,节约资源, 提高效率
  • DI 的思想是:Spring框架替我们完成属性赋值的操作
三、spring的IOC配置版
1、pom.xml添加spring相关依赖
<dependencies>
    <!--测试-->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.11</version>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-beans</artifactId>
        <version>4.2.5.RELEASE</version>
    </dependency>

    <!--支持注解-->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>4.2.5.RELEASE</version>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>4.2.5.RELEASE</version>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-test</artifactId>
        <version>4.2.5.RELEASE</version>
    </dependency>

</dependencies>
2、spring的配置文件:applicationContext.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: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">

    <!--IOC:控制反转,即利用反射的原理,创建service的实例对象-->
    <bean id="service" class="com.java.service.impl.EmpServiceImpl">
        <!--DI:依赖注入,即调用set方法,为属性dao赋值-->
        <property name="dao" ref="dao"/>
    </bean>
    <!--IOC:控制反转,即利用反射的原理,创建dao的实例对象-->
    <bean id="dao" class="com.java.dao.impl.EmpDaoImpl"></bean>
    <!--IOC:控制反转,即利用反射的原理,创建Emp的实例对象-->
    <bean id="Emp" class="com.java.model.Emp">
        <!--DI:依赖注入,即调用set方法,为属性name赋值-->
        <property name="name" value="黄容"></property>
    </bean>
</beans>
3、service层实现类
package com.java.service.impl;

import com.java.dao.IEmpDao;
import com.java.model.Emp;
import com.java.service.IEmpService;

/**
 * @author Liushun
 * @date Created in 2018/6/1 20:42
 * @description service层实现类
 */
public class EmpServiceImpl implements IEmpService {

    private IEmpDao dao;

    public IEmpDao getDao() {
        return dao;
    }
    
    // 配置版需要提供set方法
    public void setDao(IEmpDao dao) {
        this.dao = dao;
    }

    // 调用dao的方法
    @Override
    public void saveEmp(Emp emp) {
        dao.insertEmp(emp);
    }
}
4、dao层实现类
package com.java.dao.impl;

import com.java.dao.IEmpDao;
import com.java.model.Emp;

/**
 * @author Liushun
 * @date Created in 2018/6/1 20:50
 * @description dao层实现类
 */
public class EmpDaoImpl implements IEmpDao {

    @Override
    public void insertEmp(Emp emp) {
        System.out.println("模拟新增:" + emp);
    }
}
5、web测试类
package com.java.test;

import com.java.dao.IEmpDao;
import com.java.model.Emp;
import com.java.service.IEmpService;
import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * @author Liushun
 * @date Created in 2018/6/1 20:53
 * @description web测试类
 */
public class LocTest {

    // 使用通用工厂类来实例化application.xml中配置的bean标签的对象
    @Test
    public void addEmpTest(){
        // 加载spring配置文件
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        // 加载application.xml配置文件中相应的bean标签
        Emp emp = (Emp) context.getBean("Emp");
        IEmpService service = (IEmpService) context.getBean("service");
        IEmpDao dao = (IEmpDao) context.getBean("dao");

        service.saveEmp(emp);
    }

}
四、spring的IOC注解版
1、简介:

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

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

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

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

2、类的注解:

通用型:@Component

Dao层:@Repository

Service层:@Service

Web层:@Controller

3、属性注解

@Autowired:根据类型进行注入

4、示例
1、在applicationContext.xml中开启spring的注解
<!--开启spring注解:所有类的注解默认是关闭的-->
<context:component-scan base-package="com.java"/>
2、dao层
package com.java.dao.impl;

import com.java.dao.IEmpDao;
import com.java.model.Emp;
import org.springframework.stereotype.Repository;

/**
 * @author Liushun
 * @date Created in 2018/6/1 20:50
 * @description dao层实现类
 */
@Repository
public class EmpDaoImpl implements IEmpDao {

    @Override
    public void insertEmp(Emp emp) {
        System.out.println("模拟新增:" + emp);
    }
}
3、service层
package com.java.service.impl;

import com.java.dao.IEmpDao;
import com.java.model.Emp;
import com.java.service.IEmpService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * @author Liushun
 * @date Created in 2018/6/1 20:42
 * @description service层实现类
 */
@Service
public class EmpServiceImpl implements IEmpService {

    @Autowired
    private IEmpDao dao;

    // 调用dao的方法
    @Override
    public void saveEmp(Emp emp) {
        dao.insertEmp(emp);
    }
}
4、测试类
package com.java.test;

import com.java.model.Emp;
import com.java.service.IEmpService;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

/**
 * @author Liushun
 * @date Created in 2018/6/1 20:53
 * @description 测试类
 */
// 开启spring自带的测试功能
@RunWith(SpringJUnit4ClassRunner.class)
// 读取spring配置文件
@ContextConfiguration("/applicationContext.xml")
public class LocTest {

    @Autowired
    private IEmpService service;

    @Autowired(required = false)
    private Emp emp;

    @Test
    public void springTest(){
        service.saveEmp(emp);
    }
}
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值