Spring3第一天

2024-02-16 04:38
文章标签 java spring 第一天 spring3

本文主要是介绍Spring3第一天,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

l   Spring框架的概述

l   Spring的快速入门

l   IoC容器装配Beanxml配置方式)

l   Ioc容器装配Bean(注解方式)

l   web项目中集成Spring

l   Spring 整合 junit4 测试

 

1.1  Spring的学习路线:

Spring第一天:IOC控制反转.

Spring第二天:AOP面向切面编程.

Spring第三天:声明式事务管理,SSH整合.

1.2  Spring框架的概述:

1.2.1   什么是Spring:

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

* web层:SpringMVC.

* 业务层:Bean管理,声明式事务.

* 持久层:SpringJDBCTemplate,Spring的ORM模块(整合其他的持久层框架)

 

Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE Developmentand Design中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。

 

1.2.2   Spring的核心:

*Spring核心是IOC(控制反转) 和 AOP(面向切面编程)

1.2.3   Spring的由来:

*SUN公司提供的EE的解决方案:EJB

2002 Expert One-to-One J2EE Design and Development   (EJB用途)

2004ExpertOne-to-One J2EE Development without EJB (阐述EE开发需要什么)

1.2.4   为什么要学习Spring:(好处)

1.方便解耦,简化开发

Spring就是一个大工厂,可以将所有对象创建和依赖关系维护,交给Spring管理

2.AOP编程的支持

Spring提供面向切面编程,可以方便的实现对程序进行权限拦截、运行监控等功能

3.声明式事务的支持

只需要通过配置就可以完成对事务的管理,而无需手动编程

4.方便程序的测试

Spring对Junit4支持,可以通过注解方便的测试Spring程序

5.方便集成各种优秀框架

Spring不排斥各种优秀的开源框架,其内部提供了对各种优秀框架(如:Struts、Hibernate、MyBatis、Quartz等)的直接支持

6.降低JavaEE API的使用难度

Spring 对JavaEE开发中非常难用的一些API(JDBC、JavaMail、远程调用等),都提供了封装,使这些API应用难度大大降低

1.2.5   Spring版本:

Spring3.x和Spring4.x

1.3  Spring框架快速入门:

1.3.1   Spring的快速入门:

步骤一:下载Spring的开发的jar包:

下载Spring的jar包:

目录结构:

* docs   :API文档和Spring的开发规范.

* lib    :Spring开发的jar包

* schema :约束.

Spring框架的体系结构:

步骤二:创建工程引入相应的jar包:

引入相应的jar包:

* beans、core、 context、 expression language.

* 引入日志的依赖jar包:

* commons-logging.jar包:类似于slf4j.jar(用于整合其他日志)

* 具体的日志解决log4j.

* 引入log4j.properties

步骤三:编程实现Spring的IOC.

创建包:

* cn.itcast.spring3.demo1

* 接口:UserService

* 实现类:UserServiceImpl

步骤四:在src下创建一个:

* applicationContext.xml

* 引入约束:

*spring-framework-3.2.0.RELEASE\docs\spring-framework-reference\html\xsd-config.html

<beansxmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

* 配置一个<bean>标签

<!-- bean标签: id :类起个别名    class:类的全路径 -->

<beanid="userService"class="cn.itcast.spring3.demo1.UserServiceImpl"></bean>

步骤五:编写测试类:

@Test
// Spring的IOC容器:
public void demo2(){// 工厂 + 反射+ 配置文件// 创建工厂ApplicationContextapplicationContext = newClassPathXmlApplicationContext("applicationContext.xml");// 通过工厂获得类:UserServiceuserService = (UserService) applicationContext.getBean("userService");userService.sayHello();
}

1.3.2   (*****)控制反转(IOC)和依赖注入(DI)的区别

IOC:控制反转.将对象的创建权,反转到了Spring.

DI:依赖注入.Spring创建对象的过程中,把这个对象所依赖的对象注入(设置)进来.

* 面向对象的设计:

* 依赖:

public class A{
private B b;
}
* 继承:isa(是一个)
Public class A{
}
Public class B extends A{
}

* 聚合:hasa(有一个)

* 聚集:(紧密)

* 组合:(松散)

 

1.3.3   ApplicationContext对象的实现类:

 

底层实现类:

* ClassPathXmlApplicationContext :加载类路径下:Spring的配置文件.获得Bean的信息.

* FileSystemXmlApplicationContext    :加载磁盘路径下:Spring的配置文件.

1.3.4   BeanFactory和ApplicationContext的关系:

在早期开发中,可以使用BeanFactory获得类.

BeanFactory采取延迟加载,第一次getBean时才会初始化Bean

ApplicationContext是对BeanFactory扩展,提供了更多功能

国际化处理

事件传递

Bean自动装配

各种不同应用层的Context实现.

1.3.5   MyEclipse配置Spring提示:

Window--->preferences---->搜索xml catalog

1.4  装配Bean(XML)

1.4.1   Bean的实例化:(了解)

Spring框架创建Bean.有几种创建的形式?

* 第一种:使用类的默认构造器的方式:(默认使用)

* 第二种:使用静态工厂实例化.

* 第三种:使用实例工厂实例化.

 

默认无参数构造方法:

<!--Bean的实例化==========================begin-->

<bean id="bean1"class="cn.itcast.spring3.demo2.Bean1"></bean>

使用静态工厂实例化类:

<!--静态工厂实例化 -->

<bean id="bean2"class="cn.itcast.spring3.demo2.Bean2Factory"factory-method="getBean2"></bean>

使用实例工厂实例化:

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

<bean id="bean3Factory"class="cn.itcast.spring3.demo2.Bean3Factory"></bean>
<bean id="bean3"factory-bean="bean3Factory"factory-method="getBean3"></bean>

1.4.2   Bean的其他的配置:

id和name的配置:

<bean>标签:

* id属性:id的命名要满足XML对ID属性命名规范必须以字母开始,可以使用字母、数字、连字符、下划线、句话、冒号

** id中一般认为不可出现特殊字符.唯一的.

* name属性:可以出现特殊字符的.没有唯一的要求(唯一的).

 

***** 如果元素上没有id只有name,那么这个name属性可以被作为id使用.

* spring整合struts1的时候:

* <bean name=”/login” class=”...UserAction”/> :这种写法中有一个 / 特殊字符,这个时候如果使用 id的话.报错.

Bean的作用范围:

通过<bean>标签上scope属性配置类的作用范围:

* singleton      :Spring框架创建Bean的时候,使用单例这种模式.

* prototype      :Spring框架创建Bean的时候,采用多例的.

* request        :web项目中,创建一个Bean对象,Bean的对象存到request范围.   @当声明为request的时候其实就是声明要保存的东西存储到request的域中,当取得时候直接从request域中获得就可以了。

* session        :web项目中,创建一个Bean对象,将Bean的对象存到session范围.

* globalsession  :一般用于Porlet应用环境.(分布式环境.)如果没有这种环境,globalsession和session是等价的.

***** 开发中经常使用的是singletonprototype.

Bean的生命周期:

生命周期:这个类从创建到销毁过程.

* 通过<bean>标签上init-method和destroy-method指定初始化和销毁执行的方法.

<!-- Bean的生命周期 -->

<beanid="userDao" class="cn.itcast.spring3.demo4.UserDaoImpl" init-method="setup" destroy-method="teardown"></bean>

***** 销毁的方法执行,必须bean是单例的而且关闭工厂.

Bean的完整的生命周期:(提供了11个过程.)

1.instantiate bean对象实例化

2.populate properties 封装属性

3.如果Bean实现BeanNameAware 执行 setBeanName

4.如果Bean实现BeanFactoryAware 或者 ApplicationContextAware 设置工厂 setBeanFactory 或者上下文对象 setApplicationContext

5.如果存在类实现 BeanPostProcessor(后处理Bean,执行postProcessBeforeInitialization

6.如果Bean实现InitializingBean 执行 afterPropertiesSet

7.调用<beaninit-method="init"> 指定初始化方法 init

8.如果存在类实现 BeanPostProcessor(后处理Bean,执行postProcessAfterInitialization

9.执行业务处理

10.如果Bean实现 DisposableBean 执行 destroy

11.调用<beandestroy-method="customerDestroy"> 指定销毁方法 customerDestroy

 

* 第三步和第四步让Bean了解Spring容器.

***** BeanPostProcessor:工厂勾子.允许用户对其进行扩展.

* 每个类在实例的时候,后处理Bean都会执行.对这个类进行扩展.

 

* 扩展有几种方式?

* 继承:

* 装饰者模式:

* 动态代理:

 

* 后处理Bean通常与动态代理一起使用,完成Bean的增强的操作.(Spring中有很多的地方都使用了后处理Bean).

* 对UserDao中的add方法进行权限校验/时间监控?

* Proxy:

* static Object newProxyInstance(ClassLoaderclassLoader,Class[] interfaces,InvocationHandler h);

1.4.3   IOC容器DI操作:

构造方法的注入:

类:

publicclass Car {
private String name;
private double price;
public Car(String name,double price){this.name= name;this.price= price;
}
}

配置:

<!--属性的注入 -->

<bean id="car"class="cn.itcast.spring3.demo5.Car"><constructor-argname="name" value="宝马"/><constructor-argname="price" value="1000000"/>
</bean>

或者配置成:

<!-- 属性的注入 -->
<bean id="car"class="cn.itcast.spring3.demo5.Car"><constructor-argindex="0" type="java.lang.String" value="宝马"/><constructor-argindex="1" type="double" value="1000000"/>
</bean>

Set方法注入:(*****)

类:

public class Car2 {
private Stringname;
private doubleprice;
public voidsetName(String name) {this.name = name;
}
public voidsetPrice(double price) {this.price = price;
}
}

配置:

<beanid="car2" class="cn.itcast.spring3.demo5.Car2"><!-- set方法注入: --><property name="name"value="奔驰"/><property name="price"value="1100000"/>
</bean>

***** value注入的是普通属性.ref注入的是依赖的其他Bean.

<bean id="car2"class="cn.itcast.spring3.demo5.Car2"><!-- set方法注入: --><property name="name" value="电驴" /><property name="price"value="2000"/>
</bean><beanid="person" class="cn.itcast.spring3.demo5.Person"><property name="name"value="刘跃东"/><property name="car2" ref="car2"/>
</bean>

1.4.4   名称空间p的注入:

简化属性的注入:

* 如果类中有很多的属性,那么需要配置很多的<property>标签,那么这样的话,就会比较麻烦.

Spring2.5版本以后提供名称空间p的注入形式:

* 语法:

* p:属性名=”值”

* p:属性名-ref=”对象”

 

步骤一:引入名称空间p:

*

<beansxmlns="http://www.springframework.org/schema/beans"xmlns:p="http://www.springframework.org/schema/p"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="
http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd">

步骤二:改写配置文件:

<bean id="person"class="cn.itcast.spring3.demo5.Person"><property name="name"value="刘跃东"/><property name="car2" ref="car2"/>
</bean>

使用名称空间p之后:

<bean id="person"class="cn.itcast.spring3.demo5.Person" p:name="刘跃东"p:car2-ref="car2"></bean>

1.4.5   SpEL注入:

SPEL:Springexpression language(Spring 3.0中提供新的特性:)

语法:

* #{SpEL}

<property name="name"value="#{carInfo.name}" />     <!--引用是另一个对象的name属性-->
<property name="price"value="#{20000}"/>    <!--引用的是普通的值-->
<property name="price"value="#{carInfo.countMoney()}"/> <!--引用的是对象的某个方法-->

 

1.4.6   注入集合属性:

List
* <propertyname="list"><list><value>宝马</value><value>奔驰</value></list></property>Set
* <propertyname="set"><set><value>刘跃东</value><value>梁桐</value></set></property>Map
* <propertyname="map"><map><entrykey="刘跃东"value="250"/><entrykey="梁同"value="380"/></map></property>Properties
* <propertyname="properties"><props><propkey="刘跃东">250</prop><propkey="梁同">380</prop></props></property>

1.4.7   Spring支持多文件的配置:

第一种方式:

* ApplicationContext applicationContext = newClassPathXmlApplicationContext("bean1.xml","bean2.xml");

 

第二种方式:

* <importresource="classpath:applicationContext2.xml"/>

1.5  装配Bean(基于注解)

1.5.1   注解的方式装配Bean

注解的IOC的开发:

步骤一:引入spring开发的jar包:

注解的开发引入的jar和xml方式的开发的jar包相同.

步骤二:创建包和类:

 

步骤三:注解开发:

在编程的Service的类上添加一个注解;

* @Component("userService")

步骤四:在src下创建一个applicationContext.xml

引入一个context的头约束:

<beansxmlns="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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd">

配置spring框架扫描的包:

<!-- 扫描包的类上的注解 -->

<context:component-scanbase-package="cn.itcast.spring3.demo1"/>

 

步骤五:编写测试类:

@Test

public void demo1() {ApplicationContextapplicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");UserServiceuserService = (UserService) applicationContext.getBean("userService");userService.sayHello();
}

 

补充:

提供了@Component的三个衍生注解:

* web层:@Controller

* 业务层:@Service

* DAO层:@Repository

 

这三个注解是为了让标注类本身的用途清晰,Spring在后续版本会对其增强

1.5.2   注解完成属性的注入:

普通属性:

* @Value的注解:

@Value(“itcast”)

private String info;

 

对象属性:

* @Autowired的注解:

@Autowired

private UserDaouserDao;

 

* @Autowired注解:默认按类型装配.

* @Qualifier注解和@Autowired注解组合使用 按名称进行装配.

***** 注解的属性的注入:可以没有set方法. @Value/@Autowired 注解可以修饰成员变量,修饰set方法.如果修饰了成员变量,可以不用提供set方法.

 

Sprin提供了对JSR-250(标准)的支持:

@Resource(name="userDao")

* 相当于

@Autowired

@Qualifer(“userDao”)

1.5.3   Bean的生命周期:

@PostConstruct   相当于<bean init-method=””>

@PreDestroy      相当于<bean destroy-method=””>

1.5.4   Bean的作用范围:

在类上添加一个注解:

@Scope(“prototype”)

1.5.5   Spring3.0以JavaConfig为核心,提供使用Java类定义Bean信息的方法(很少使用)

JavaConfig:用一个Jave类作为一个配置.

 

定义一个类:让这个类作为配置(工厂)

@Configuration
public class BeanConfig {
@Bean(name="car")
public CarshowCar(){Car car = new Car();car.setName("保时捷");car.setPrice(2000000);return car;
}
@Bean(name="product")
public ProductshowProduct(){Product product = new Product();product.setName("空调");product.setPrice(2000);return product;
}
}

 

让Spring框架可以扫描到注解:

 

编程测试程序:

1.5.6   企业开发中使用XML还是注解:

XML:

* 结构清晰:

 

注解:

* 属性注入:

 

结合XML和注解方式:(混合使用)

* bean的管理一般都交给XML配置.

* <bean id=”” class=””>

 

* bean的属性注入一般采用注解.

* @Autowired

* @Qualifer

 

XML和注解混合使用的话:

* Bean在XML中配置,Bean的属性由注解的方式注入:

* 需要开启一个注解的支持:

<!-- 开启注解的支持: -->

<context:annotation-config/>

1.6  Spring在web项目中使用:

在Servlet中编写如下代码:

public void doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException, IOException {ApplicationContextapplicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");UserServiceuserService = (UserService)applicationContext.getBean("userService");userService.add();
}

 

发现一个问题:

* 每次执行Servlet的时候,都会创建一个Spring的工厂(加载Spring的环境.)只需要加载一次就可以了!!!

* 解决方案一:可以把加载Spring的环境的代码放到Servlet的init方法中.

***** 一个Servlet中可以使用没有问题的,如果有很多的Servlet.

* 解决方案二:ServletContext.全局对象.服务器启动的时候创建.

* 将Spring的工厂放到ServletContext中.

* ServletContextListener:监听ServletContext对象的创建和销毁.

 

* 需要引入:spring-web-3.2.0.RELEASE.jar

 

* 配置监听器:

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

* 配置初始化参数:

 <context-param><param-name>contextConfigLocation</param-name><param-value>classpath:applicationContext.xml</param-value></context-param>

* 改写Servlet:

第一种方式:

WebApplicationContext applicationContext =WebApplicationContextUtils.getWebApplicationContext(getServletContext());

 

另一种方式:

WebApplicationContext applicationContext =(WebApplicationContext)getServletContext().getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);

 

1.7  Spring整合JUnit单元测试:

步骤一:工程中有Junit的开发环境.

步骤二:导入spring-test-3.2.0.RELEASE.jar

步骤三:在测试类中添加注解:

@RunWith(SpringJUnit4ClassRunner.class)

@ContextConfiguration("classpath:applicationContext.xml")

public class SpringTest1 {

 

@Autowired

@Qualifier("userService")

privateUserService userService;

@Test

public voiddemo1(){

    userService.add();

}

}

今天的内容总结:

IOC:

* Spring的概述:

* Spring一站式框架有EE开发中每一层的解决方案:

* web:Spring MVC

* service:bean管理事务

* dao:JdbcTemplate orm模块

 

* Spring的快速入门:

* 引入包:

* beans,core,context,expression

* 整合日志jar包.

* 创建包和类:

* HelloService

* 将这个类配置到Spring的配置文件中:

* <bean id=”” class=””/>

* 编写测试类:

* 获得工厂类:

* 通过工厂获得类:

* 调用业务方法:

* IOC:底层实现原理:工厂+反射+配置文件.

* IOC和DI区别:

* IOC:控制反转:将对象的创建权交给(反转给)Spring

* DI:依赖注入:在Spring创建这个类的过程中,将这个类依赖的对象注入进来.

 

* SpringIOC(Bean的装配)

* XML:

* id name scope init-methoddestroy-method

* scope:

* singleton

* prototype

* 实例化方式:

* 三种:(了解)

* 属性注入 :

* 构造方法:

* set方法:

* Spring2.5中提供p名称空间注入:

* Spring3.0中提供SpEL注入:

 

* 注解:

* 定义类:

* 引入context约束:

* 在类上添加@Component注解:

* 衍生注解:

* @Controller

* @Service

* @Repository

* 配置spring配置文件扫描类上的注解:

* 属性注入:

* 普通属性:

* @Value

 

* 对象属性:

* @Autowired

* @Qualifer

* 衍生注解@Resource

 

* @Scope

XML和注解可以结合使用:

* 开启注解的支持:

* Bean一般在XML中配置:

* 属性注解的注入:

 

* Spring整合web项目:

* Spring整合JUnit单元测试:

这篇关于Spring3第一天的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/713510

相关文章

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

Spring Security--Architecture Overview

1 核心组件 这一节主要介绍一些在Spring Security中常见且核心的Java类,它们之间的依赖,构建起了整个框架。想要理解整个架构,最起码得对这些类眼熟。 1.1 SecurityContextHolder SecurityContextHolder用于存储安全上下文(security context)的信息。当前操作的用户是谁,该用户是否已经被认证,他拥有哪些角色权限…这些都被保

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

Java进阶13讲__第12讲_1/2

多线程、线程池 1.  线程概念 1.1  什么是线程 1.2  线程的好处 2.   创建线程的三种方式 注意事项 2.1  继承Thread类 2.1.1 认识  2.1.2  编码实现  package cn.hdc.oop10.Thread;import org.slf4j.Logger;import org.slf4j.LoggerFactory

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟&nbsp;开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚&nbsp;第一站:海量资源,应有尽有 走进“智听

在cscode中通过maven创建java项目

在cscode中创建java项目 可以通过博客完成maven的导入 建立maven项目 使用快捷键 Ctrl + Shift + P 建立一个 Maven 项目 1 Ctrl + Shift + P 打开输入框2 输入 "> java create"3 选择 maven4 选择 No Archetype5 输入 域名6 输入项目名称7 建立一个文件目录存放项目,文件名一般为项目名8 确定