码迷,mamicode.com
首页 > 编程语言 > 详细

01Spring_基本jia包的导入andSpring的整体架构and怎么加入日志功能

时间:2016-07-25 18:17:26      阅读:1264      评论:0      收藏:0      [点我收藏+]

标签:

1.什么是Spring :

Spring是分层的JavaSE/EE full-stack(一站式) 轻量级开源框架

n  分层: 来自JavaEE体系结构 (客户端层、 web层、业务层、持久层 )

服务器端三层结构 (web层、业务层、持久层)

       Servlet + JSP ----  web层技术 ---- Struts2框架

       JDBC 接口 ---- 持久化技术  ---- Hibernate框架

       EJB 框架(复杂) ---- 业务层技术 ---- Spring 框架 (取代EJB出现 )

             Spring 出现,就是为了解决常见JavaEE 企业开发问题!

        一站式: Spring框架提供了 web层(表现层) SpringMVC、业务层 IoC、AOP和事务管理、持久层JdbcTemplate  各层javaEE软件开发解决方案

2.Spring的核心:

 

IoC: 控制反转

AOP: 面向切面编程

3.Spring 体系结构

技术分享

这个不好记我们可以根据Spring的官方文档去记忆

Spring官方文档截图:

技术分享

目录如下:

 

   第一章 Spring框架概述

  第二章 Spring3.x 新特性

  第三章核心技术(IoC、AOP、测试)

  第四章数据访问(事务管理、 JdbcTemplate使用、整合其它ORM框架)

  第五章 web技术(SpringMVC)

  第六章集成(WebService、 JavaMail、JMS、任务调度、缓存)

 

 

从官网下下载的开发包有两个:

    一个是spring-framework-3.2.0.RELEASE-dist.zip(依赖包)

         一个是spring-framework-3.0.2.RELEASE-dependencies.zip(开发包)

我们用的是开发包

解压后的目录如下:

技术分享

 

 

 

每个文件的作用:

Docs 文档目录(API 和 规范)

Libs 开发需要jar包(包含javadoc和source)

Schema 所有约束文档

4.导入Jar包到项目中

要进行Ioc开发和DI开发的话,需要导入最核心的Spring的jar包。需要导入四个核心的jar包,进入spring-framework-3.0.2.RELEASE-dependencies解压文件夹。找到以下四个jar包。

技术分享

我们为了有Spring的日志功能,需要导入commons-logging的日志包以及log4j包(日志功能需要commons-logging和log4j一起用,注意, commons-logging 要配合log4j 记录日志,必须把log4j的jar 包也导入到项目中)这两个包jar包不在spring-framework-3.0.2.RELEASE-dependencies包(开发包)中,而是在spring-framework-3.2.0.RELEASE-dist.zip(依赖包)中。然后把log4j.properties这个文件拷贝到src目录下。

log4j.properties的内容如下:

### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

### direct messages to file mylog.log ###
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=c:/mylog.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

### set log levels - for more verbose logging change ‘info‘ to ‘debug‘ ###

log4j.rootLogger=info, stdout

项目整体的结构如下所示:

技术分享

测试后就会输出日志,

 

 

 

 

 

 

 

 

Spring 框架 第一天 IoC

今天核心内容:

1、Spring框架相关知识 (什么是Spring? 解决什么问题? 课程如何安排)

2、Spring Ioc和DI 快速入门案例

3、Spring XML 容器工厂配置

4、Spring 注解配置

5、在web项目中集成Spring框架

6、Spring和Junit整合完成测试

 

1.    Spring 框架概述

1.1.   什么是Spring

Spring是分层的JavaSE/EE full-stack(一站式) 轻量级开源框架

n  分层: 来自JavaEE体系结构 (客户端层、 web层、业务层、持久层 )

服务器端三层结构 (web层、业务层、持久层)

       Servlet + JSP ----  web层技术 ---- Struts2框架

       JDBC 接口 ---- 持久化技术  ---- Hibernate框架

       EJB 框架(复杂) ---- 业务层技术 ---- Spring 框架 (取代EJB出现 )

技术分享

Spring 出现,就是为了解决常见JavaEE 企业开发问题!

n  一站式: Spring框架提供了 web层(表现层) SpringMVC、业务层 IoC、AOP和事务管理、持久层JdbcTemplate  各层javaEE软件开发解决方案

n  轻量级:相对于EJB框架而言

1.2.   Spring核心

IoC: 控制反转

AOP: 面向切面编程

l  官网:http://www.springsource.org/

 

1.3.   Spring 给软件开发带来了什么

方便解耦,简化开发 (Spring IoC特性)

AOP编程的支持

声明式事务的支持

方便程序的测试

方便集成各种优秀框架 (整合Struts2 、 Hibernate 、MyBatis 、Struts1 )

降低JavaEE API的使用难度 (Spring 提供大量工具类, 简化代码编写 )

 

1.4.   Spring 体系结构

技术分享

从Spring规范文档 去记忆 Spring 中内容

Spring规范

技术分享

第一章 Spring框架概述

第二章 Spring3.x 新特性

第三章核心技术(IoC、AOP、测试)

第四章数据访问(事务管理、 JdbcTemplate使用、整合其它ORM框架)

第五章 web技术(SpringMVC)

第六章集成(WebService、 JavaMail、JMS、任务调度、缓存)

 

课程安排:

       第一天: Spring IOC 、web集成、 测试

       第二天: Spring AOP、JdbcTemplate

       第三天: 事务管理, 整合ORM框架(三大框架整合 )

2.    Spring框架IoC和DI 快速入门

IoC和DI 是整合Spring学习的核心

技术分享

2.1.   下载开发包

http://projects.spring.io/spring-framework/ 网址下载开发包

最新版本4.1 课程 3.2

 

开发包3.2

spring-framework-3.2.0.RELEASE-dist.zip

依赖吧 3.0 (常见开源技术jar包)

spring-framework-3.0.2.RELEASE-dependencies.zip

 

Spring目录结构

技术分享

Docs 文档目录(API 和 规范)

Libs 开发需要jar包(包含javadoc和source)

Schema 所有约束文档

2.2.   导入jar包到项目

进行Ioc和DI的开发,只需要导入最核心spring的jar包

技术分享

Spring运行,使用commons-logging日志技术

       (commons-logging 和 slf4j 都属于统一日志接口, 整合log4j日志实现 )

导入log4j jar

技术分享

2.3.   理解IoC和DI的概念

什么是IoC ? 什么是DI ? 区别是什么?

IoC: 控制反转, 解决程序对象紧密耦合问题(工厂+反射+ 配置文件), 将程序中原来构造对象的权限,交给IoC容器来构造,当程序需要对象,找IoC容器获取。

技术分享

 

DI : 依赖注入 , IoC容器需要为程序提供依赖对象,返回对象所依赖对象一同可以提供(Servlet需要Service, 找Ioc容器获取Service, Service由容器提供,Service依赖DAO ,IoC容器提供Service对象同时, 将Service依赖DAO 注入到Service中)

       IoC容器到底为程序提供了什么?提供依赖对象

 

2.4.   编写IoC和DI入门案例

技术分享

2.4.1.    传统代码 

       测试代码 :

       技术分享

       表现层代码

技术分享

       业务层代码

       技术分享

 

2.4.2.    将所有对象,交给IoC容器(Spring)来管理

       (spring配置文件 通常可以在src 或者 WEB-INF目录下, 通常名称 applicationContext.xml )

       参考文档 : xsd-config.html

技术分享

配置本地schema位置

技术分享

技术分享

 

通过applicationContext.xml 配置Spring管理对象

 

在程序中通过ApplicationContext接口 获取spring工厂对象

n  ClassPathXmlApplicationContext 读取 src下配置文件

n  FileSystemXmlApplicationContext 读取WEB-INF下配置文件

IoC 通过工厂,从Spring容器获取创建好对象

技术分享

DI 在通过工厂获取,spring对象时,spring同时提供对象所依赖的对象

技术分享

配置

技术分享

练习: 在代码上,将UserDAO 注入到 UserService 

2.5.   Spring提供对象工厂

BeanFactory 和 ApplicationContext 接口

       ApplicationContext 是 BeanFactory 子接口,BeanFactory 才是Spring框架最核心工厂接口。

       ApplicationContext 是对BeanFactory 接口扩展, 企业开发很少直接使用BeanFactory

       ApplicationContext 会在容器初始化时,对其中管理Bean对象进行创建, BeanFactory 会在对象获取时才进行初始化 。

 

3.    IoC容器装配Bean(xml配置)

3.1.   三种实例化Bean的方式

方式一: 使用类构造器实例化对象

<!-- 方式一  使用构造器(无参数)实例化对象  -->

   <bean id="bean1"

class="cn.itcast.spring.b_instance.Bean1" />

 

方式二: 使用静态工厂 静态方法,对对象实例化

<!-- 方式二使用静态工厂实例化对象 -->

   <!-- 调用工厂的 factory-method 返回对象 -->

   <bean id="bean2"

class="cn.itcast.spring.b_instance.Bean2Factory" factory-method="getBean2" />

 

方式三: 使用实例工厂 实例方法 对对象实例化

<!-- 方式三使用实例工厂实例化对象 -->

   <!-- 先实例化工厂 -->

   <bean id="bean3Factory" class="cn.itcast.spring.b_instance.Bean3Factory" />

   <!-- 再通过工厂对象的实例方法,构造目标对象 -->

   <bean id="bean3" factory-bean="bean3Factory"

factory-method="getBean3" />

 

应用场景: 大多数情况,可以通过构造器直接实例化, 只有在对象构造过程非常复杂的情况下,才会采用工厂实例化的方式

 

3.2.   Bean的作用域

Spring为Bean对象,提供五种作用域

技术分享

最常用 singleton 和 prototype 两种

       Singleton (单例): 在一个BeanFactory对象中,引用唯一的一个目标实例

       Prototype (多例): 每次通过工厂执行getBean时,返回不同实例对象

       Request (请求范围) : 创建对象保存在request范围,如果request销毁,对象销毁

       Session (会话范围):创建对象保存Session中,如果session销毁,对象销毁

       * globalSession (全局会话):分布式系统,全局会话的概念,一次登录,应用多个系统

技术分享

单例Bean 在容器初始化时,实例化 (只实例化一次 )

多例Bean 在工程执行getBean时 才会实例化 (每调用一次,返回不同对象 )

3.3.   Bean的生命周期

可以通过 init-method属性配置 Bean对象初始化执行方法,destory-method属性配置Bean对象销毁的方法

       (初始化方法和构造方法 有区别? 构造方法作用申请空间,为对象基本属性初始化 , 初始化方法 对象复杂构造过程 , java语言建议将对象复杂构造过程单独抽取 初始化方法 )

技术分享

配置

技术分享

       在对象构造后,立即执行初始化init , 默认没有执行destroy 销毁方法

技术分享

3.4.   后处理器(后处理Bean)--- 补充

在Spring构造Bean对象过程中,有一个环节对Bean对象进行 后处理操作 (钩子函数) ----- Spring 提供 BeanPostProcessor 接口

       可以自定义类,实现 BeanPostProcessor 接口,配置到Spring容器中,在构造对象时,spring容器会调用接口中方法

技术分享

 

后处理器,在对象构造过程中,提供代理, 是AOP自动代理核心 !

技术分享

3.5.   Bean的依赖注入

3.5.1.    依赖注入方式

三种注入方式

技术分享

1、 构造参数属性注入

2、 setter方法属性注入

3、 接口属性注入

 

Spring 配置文件支持构造参数属性注入和 setter方法属性注入!

3.5.2.    构造参数的属性输入

技术分享

通过constructor-arg 属性进行构造参数注入

技术分享

3.5.3.    setter方法属性注入

技术分享

在配置文件 使用<property> 元素完成setter属性注入

技术分享

3.5.4.    属性注入深入

【知识点】 p名称空间的使用

       P名称空间,在spring2.5版本后引入,为了简化属性依赖注入(setter方法)

第一步: 在配置文件,引入p名称空间

技术分享

第二步: 简化setter方法注入配置

技术分享

技术分享

 

【知识点】 spEL表达式的使用

       在spring3.0之后,引入spEL 表达式语言,简化属性注入

       参考 “Spring_表达式语言.pdf” 学习

       语法: #{表达式}

用法一: 直接通过value注入,引用一个Bean对象

用法二: 引用一个Bean对象属性

用法三: 直接调用对象的方法

技术分享

技术分享

3.5.5.    集合元素类型属性注入

技术分享

Spring为每种集合都提供一个元素标签 进行注入

技术分享

技术分享

技术分享

 

4.    IoC容器装配Bean(注解配置)

4.1.   使用注解配置Bean

Spring注解开发需要jar包 和 xml开发 一样的 !

第一步: 新建项目, 导入jar包

第二步: 在需要spring创建对象类上面 添加@Component (注解 来自spring2.5 )

技术分享

第三步: 配置注解Bean所在package

引入context命名空间

技术分享

配置提示

技术分享

配置注解对象所在包

技术分享

 

Spring为了细分组件的功能,在提供@Component注解,提供三个等价的注解

       @Controller 控制器,表示web层组件  ---- action

       @Service 业务类,表示业务层组件 --- service

       @Repository 表示持久层的组件 --- dao

4.2.   Bean属性依赖注入

在spring2.5 版本,没有提供基本类型属性注入 ,但是spring3.0引入注解@Value

4.2.1.    向对象注入基本类型属性

技术分享

4.2.2.    向对象注入复杂对象属性

技术分享

4.2.3.    spring2.5 注入复杂对象属性

n  spring2.5 提供自动装配注解 @Autowired

@Autowired 默认按照类型进行注入 (缺点: 如果容器中存在两个对象,是相同类型, @Autowired 无法注入 )

       @Autowired + @Qualifier 指定注入Bean的id

技术分享

 

n  Spring支持JSR-250规范,引入@Resource ,功能和@Autowired 相同

技术分享

重点记忆: @Autowired 和 @Resource

4.3.   Spring注解其它配置

4.3.1.    初始化和销毁方法配置

@PostConstruct 初始化

@PreDestroy 销毁

技术分享

4.3.2.    bean的作用域

通过@Scope注解指定作用

技术分享

4.3.3.    注解和配置文件混合使用

Bean定义配置,使用配置文件方式

Bean关系依赖注入,使用注解配置方式

       如果在配置使用 context:component-scan 具有 context:annotation-config 效果

 

如果Bean是通过xml配置,想使用注解依赖注入,必须单独配置

       <context:annotation-config />

技术分享

5.    web开发中应用Spring框架

直接在项目集成spring ,在servlet 创建Spring容器

技术分享

问题: 每次请求都会创建一个spring容器对象,将容器管理对象都重新创建

---- 性能问题、 内存溢出

 

解决: 在一个web容器中, 保证spring容器只被初始化一次

       1) static --- 问题: 违背面向对象

       2) servlet init 方法中 ---- 问题: spring容器对象如何被其它Servlet访问

       3) ServletContext 容器保存数据唯一, ServletContextListener 初始化时容器方法只被调用一次

 

Spring 提供 web.jar 提供类似Listener

       第一步: 在项目导入 spring-web-3.2.0.RELEASE.jar

       第二步: 在web.xml 配置监听器

<!-- 监听器,初始化Spring容器对象 -->

  <listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

  </listener>

默认加载 /WEB-INF/applicationContext.xml

       第三步: 配置spring文件位置

       <!-- 修改spring配置文件位置 -->

  <context-param>

  <param-name>contextConfigLocation</param-name>

  <param-value>classpath:applicationContext.xml</param-value>

  </context-param>

       第四步:修改Servlet代码

// 1、创建工厂

      ApplicationContext applicationContext =

(ApplicationContext) this.getServletContext().getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);

       上面代码也可以写为

ApplicationContext applicationContext = WebApplicationContextUtils.getWebApplicationContext(this.getServletContext());

6.    spring和junit的测试集成

传统测试

技术分享

Spring和junit测试集成

第一步:在项目导入spring-test-3.2.0.RELEASE.jar

第二步:编写测试类

技术分享

 

作业:

       1、 ssh整合登陆练习(步骤参考笔记)

       2、通过BeanPostProcessor 对业务层接口进行代理,将登陆方法执行时间,记录log4j日志文件

 

 

 

01Spring_基本jia包的导入andSpring的整体架构and怎么加入日志功能

标签:

原文地址:http://www.cnblogs.com/shenxiaoquan/p/5704405.html

踩
(0)
赞
(0)
   
举报
评论 一句话评论(0)
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!