Spring核心概念

在学习Spring之前让我们先了解一下企业级应用.企业级应用是指那些为商业组织,大型企业而创建并部署的解决方案及应用,这些大型企业级应用的结构复杂,涉及的外部资源众多,事务密集,数据规模大,用户数量多.有较强的安全性考虑和较高的性能要求,而Spring就是用来做解决这些问题的

Spring是一个轻量级的框架,是当前的主流框架,它能使现有技术更加易用,推进编码最佳实践

Spring坚持一个原则:不重新发名轮子 Spring由大约20个模块组成。
分成六个部分:Core Container、DataAccess/Integration、Web、AOP、Instrumentation、Test。
Spring Core是框架的最基础的部分,提供了IOC特性
Spring Context为企业级开发提供了便利和集成的工具
Spring AOP是基于Spring Core的符合规范的面向切面编程的实现。
Spring JDBC提供了JDBC的抽象层,简化了JDBC编码
Spring ORM对市面上流行的ORM框架提供了支持
Spring Web 为Spring在Web应用程序中的使用提供了支持

Spring IOC

理解控制反转
控制反转(Inversion of Control,IoC),也称为依赖注入(Dependency Injection,DI),是面向对象编程中的一种设计理念,用来降低代码之间的耦合度
首先考虑什么是依赖,例如:在A类方法中,实例化了B类的对象并调用其方法以完成特定的功能,我们就
说A类依赖于B类,下面我们通过示例理解一下.

定义一个接口

public interface UserDao{ /** *保存用户信息的方法 */ public void save(User user); }

接口的实现类

pulbic class UserDaoImpl implements UserDao{ public void save(User user){ System.out.print("保存用户信息到数据库"); } }

用户的业务类

public class UserServiceImpl implements UserService{ //实例化所依赖的UserDao对象 private UserDao dao=new UserDapImpl(); //调用UserDao的方法保存用户信息 dao.save(User); }

以上代码所示,UserServiceImpl对UserDaoImpl存在依赖关系,这样的代码很常见,但是存在一个严重的问题,就是这个两个类是高度耦合,如果我们有新的需求需要替换UserDao的实现类,导致UserServiceImpl里面的代码也要随之发生改变,这种代码不具有优良的可扩展性和可维护性,甚至在开发中难以测试

我们可以利用简单的工厂和工厂模式的思路解决此类问题

public class UserDaoFactory{ public static UserDao getInstance(){ //具体实现过程省略 } } public class UserServiceImpl implements UserService{ //通过工厂获取所依赖的用户DAO对象 private UserDao dao=UserDaoFactory.getInstance(); public void addNewUser(User user){ //调用用户DAO的方法保存用户信息 dao.save(user); } }

这里的用户DAO工厂类UserDaoFactory就体现了"控制反转的思想":UserServiceImpl不再依赖自身的代码去获得所依赖的具体DAO对象,而是把这一工作转交给了第三方--UserDaoFactory,从而避免了和具体UserDao实现类之间的耦合

下面我们用Spring IOC 来实现

搜先我们要下载Spring的jar包
jar包下载地址 我这边是用的版本是4.3.18
解压后的文件几个重要文件夹的意思:
docs:该文件夹下包含Spring的相关文档,包括API参考文档,开发手册
libs:该文件夹下存放Spring各个模块的jar文件,每个模块均提供三项内容,开发所需的jar文件,以"-javadoc"后缀表示的API和以"-sources"后缀表示的源文件
schema:配置Spring的某些功能时需要用到的schema文件,对于已经集成了Spring的IDE环境(如MyEclipse,IDEA),这些文件不需要专门导入

我们将jar导入到项目中

Spring核心概念

为项目添加log4j.properties文件,用来控制日志输出 文件放到resources里面

# 下面的属性配置中,所有日志的输出级别是info,输出源是con log4j.rootLogger=info,error,con #定义输出源的输出位置是控制台 log4j.appender.con=org.apache.log4j.ConsoleAppender #定义输出日志的布局采用的类 log4j.appender.con.layout=org.apache.log4j.PatternLayout #定义日志输出布局 log4j.appender.con.layout.ConversionPattern=%d{MM-dd HH:mm:ss}{%p}%c%n -%m%n

编写HelloSpring类

package cn.springdemo; /** * 第一个Spring,输出"Hello,Spring!"。 * * @author 安心 */ public class HelloSpring { // 定义who属性,该属性的值将通过Spring框架进行设置 private String who = null; /** * 定义打印方法,输出一句完整的问候。 */ public void print() { System.out.println("Hello," + this.getWho() + "!"); } /** * 获得 who。 * * @return who */ public String getWho() { return who; } /** * 设置 who。 * * @param who */ public void setWho(String who) { this.who = who; } }

在resources下面创建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" xsi:schemaLocation="http://www.springframework.org/schema/beans "> <!-- 通过bean元素声明需要Spring创建的实例。该实例的类型通过class属性指定,并通过id属性为该实例指定一个名称,以便在程序中使用 --> <bean> <!-- property元素用来为实例的属性赋值,此处实际是调用setWho()方法实现赋值操作 --> <property> <!-- 此处将字符串"Spring"赋值给who属性 --> <value>Spring</value> </property> </bean> </beans>

在Spring配置文件中,使用

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zygxfy.html