spring学习笔记.doc

合集下载

Springcloud学习笔记24--JeecgBoot以微服务的方式启动jeecg-system

Springcloud学习笔记24--JeecgBoot以微服务的方式启动jeecg-system

Springcloud学习笔记24--JeecgBoot以微服务的⽅式启动jeecg-system⼀、配置host127.0.0.1 jeecg-boot-redis127.0.0.1 jeecg-boot-mysql127.0.0.1 jeecg-boot-nacos127.0.0.1 jeecg-boot-gateway127.0.0.1 jeecg-boot-system127.0.0.1 jeecg-boot-xxljob127.0.0.1 jeecg-boot-rabbitmqhost⽂件路径:C:\Windows\System32\drivers\etc⼆、启动Nacos(推荐启动nacos微服务,⾃动加载配置)a.执⾏ Nacos初始化脚本,创建nacos的Mysql库b.启动nacos服务:找到项⽬ jeecg-cloud-module/jeecg-cloud-nacos,右键执⾏类com.alibaba.nacos.JeecgNacosApplication以下是application.yml⽂件的部分内容。

db:num: 1password:'0': ${MYSQL-PWD:plj824}url:'0': jdbc:mysql://${MYSQL-HOST:127.0.0.1}:${MYSQL-PORT:3306}/${MYSQL-DB:nacos}?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone user:'0': ${MYSQL-USER:root}替换完成后,执⾏类com.alibaba.nacos.JeecgNacosApplicationc.访问http://127.0.0.1:8848/nacos(账号密码都是nacos),默认所需配置已经创建好⼿动配置nacos教程可参考:/2187366注意:jeecg-dev.yaml⽂件存储经常要修改的内容,⼀般是个性化配置。

Spring实战学习笔记之SpEL表达式

Spring实战学习笔记之SpEL表达式

Spring实战学习笔记之SpEL表达式在Spring XML配置⽂件中装配Bean的属性和构造参数都是静态的,⽽在运⾏期才知道装配的值,就可以使⽤SpEL实现SpEL表达式的⾸要⽬标是通过计算获得某个值。

在计算这个数值的过程中,会使⽤到其他的值并会对这些值进⾏操作。

SpEL特性:(1)、使⽤Bean的ID来引⽤Bean;(2)、调⽤⽅法和访问对象的属性;(3)、对值进⾏算术、关系和逻辑运算;(4)、正则表达式匹配;(5)、集合操作#{ }标记会提⽰ Spring这个标记⾥的内容是SpEL表达式。

最简单的属性注⼊:<property name="count" value="#{5}" />还可以与⾮SpEL表达式的值混⽤:<property name="message" value="The value is #{5}" />浮点数value="#{89.7}" 科学记数法value="#{1e4}"=====>10000.0String类型的字⾯值:<property name="name" value="#{'Tom'}" />或<property name="name" value='#{"Tom"}' /> 单引号和双引号相互包含的⽅式使⽤布尔类型:<property name="enable" value="#{false}" />引⽤Bean:<property name="userDao" value="#{userDao}" />等价于<property name="userDao" ref="userDao" />引⽤Bean属性:<property name="orderOwner" value="#{}" />类似代码:User user=newUser();order.setOrderOwner(user.getName());引⽤Bean的⽅法:<property name="currUser" value="#{userDao.getCurrUser()}" />(假设userDao内有公共⽅法getCurrUser())现在如果想把userDao.getCurrUser()得到的当前英⽂⽤户名转为⼤写字母:<property name="currUser" value="# {userDao.getCurrUser().toUpperCase()}" />,这时如果得到的⽤户名为空(null),则会抛NullPointerException异常,为了避免异常,可以使⽤?.代替点(.),如:<property name="currUser" value="#{userDao.getCurrUser()?.toUpperCase()}" />这样null后⾯的⽅法不再执⾏SpEL表达式中使⽤T( )运算符访问指定类的静态⽅法和常量。

SpringBootActuator学习笔记

SpringBootActuator学习笔记

SpringBootActuator学习笔记spring boot ActuatorActuator概述Actuator指的是负责和移动装置的组件。

通过Actuator暴露的端点我们可以获取⼀个正在运⾏中的应⽤内部的状态导⼊依赖<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency>Actuator具备⼀些开箱即⽤的端⼝Endpoints id描述HTTP⽅法是否敏感信息auditevents显⽰当前应⽤程序的审计事件信息GET Yesbeans显⽰应⽤上下⽂中创建的所有Bean GET Yescaches显⽰可⽤缓存信息GET Yesconditions显⽰⾃动装配类的状态及及应⽤信息GET Yesconfigprops显⽰所有 @ConfigurationProperties 列表GET Yesenv显⽰ ConfigurableEnvironment 中的属性GET Yesflyway显⽰ Flyway 数据库迁移信息GET Yeshealth显⽰应⽤的健康信息(未认证只显⽰status,认证显⽰全部信息详情)GET Noinfo显⽰任意的应⽤信息(在资源⽂件写info.xxx即可)GET Noliquibase展⽰Liquibase 数据库迁移GET Yesmetrics提供应⽤运⾏状态的完整度量指标报告GET Yesmappings显⽰所有 @RequestMapping 路径集列表GET Yes scheduledtasks显⽰应⽤程序中的计划任务GET Yessessions允许从Spring会话⽀持的会话存储中检索和删除⽤户会话。

【转】Spring学习笔记1—依赖注入(构造器注入、set注入和注解注入)

【转】Spring学习笔记1—依赖注入(构造器注入、set注入和注解注入)

【转】Spring学习笔记1—依赖注⼊(构造器注⼊、set注⼊和注解注⼊)什么是依赖注⼊在以前的java开发中,某个类中需要依赖其它类的⽅法时,通常是new⼀个依赖类再调⽤类实例的⽅法,这种⽅法耦合度太⾼并且不容易测试,spring提出了依赖注⼊的思想,即依赖类不由程序员实例化,⽽是通过spring容器帮我们new指定实例并且将实例注⼊到需要该对象的类中。

依赖注⼊的⽅式依赖注⼊有3种⽅式:构造器注⼊、set注⼊和注解注⼊。

1.构造器注⼊构造器注⼊保证⼀些必要的属性在Bean实例化时就得到设置,并且确保了Bean实例在实例化后就可以使⽤。

使⽤⽅式:1. 在类中,不⽤为属性设置setter⽅法,但是需要⽣成该类带参的构造⽅法。

2. 在配置⽂件中配置该类的bean,并配置构造器,在配置构造器中⽤到了<constructor-arg>节点,该节点有四个属性index:指定注⼊属性的顺序索引,从0开始;type:指该属性所对应的类型;ref:引⽤的依赖对象;value:当注⼊的不是依赖对象,⽽是基本数据类型时,就⽤value;例⼦1:public class SpringAction {//注⼊对象springDaoprivate SpringDao springDao;private User user;public SpringAction(SpringDao springDao,User user){this.springDao = springDao;er = user;System.out.println("构造⽅法调⽤springDao和user");}public void save(){user.setName("卡卡");springDao.save(user);}}<bean name="springAction" class="com.bless.springdemo.action.SpringAction"><!--(2)创建构造器注⼊,如果主类有带参的构造⽅法则需添加此配置--><constructor-arg index="0" ref="springDao"></constructor-arg><constructor-arg index="1" ref="user"></constructor-arg></bean><bean name="springDao" class="com.bless.springdemo.dao.impl.SpringDaoImpl"></bean><bean name="user" class="er"></bean>其中index属性表⽰注⼊的bean在构造⽅法中的参数顺序。

SpringMVC框架知识点详解

SpringMVC框架知识点详解

SpringMVC框架知识点详解官⽅的下载⽹址是:⼀、Spring MVC简介1.1Spring MVC⼯作流程映射器:主要是根据浏览器上输⼊的url来映射所有满⾜要求的Handle(控制器类)适配器:主要是决定调⽤哪个Handler来实现具体的业务逻辑1.2Spring MVC VS Struts21)springmvc的⼊⼝是⼀个servlet,即前端控制器;struts2⼊⼝是⼀个filter过虑器,即前端过滤器,2)springmvc是基于⽅法开发(控制器类是单例的,不可能维护实体变量),传递参数是通过⽅法形参,可以设计为单例;struts2是基于类开发(维护⼀个实体变量),传递参数是通过类的属性,只能设计为多例3)springmvc通过参数解析器是将request对象内容进⾏解析成⽅法形参,将响应数据和页⾯封装成ModelAndView对象,最后⼜将模型数据通过request对象传输到页⾯;struts采⽤值栈存储请求和响应的数据,通过OGNL存取数据4)springmvc开发运⾏速度快于struts2⼆、Spring MVC⼯程搭建(xml)2.1导⼊springioc,springweb , springmvc相关的jar包2.2在/WEB-INF/ web.xml⽂件配置SpringMVC的前端控制器DispatcherServlet(前端控制器)<!-- 注册springmvc核⼼控制器 --><servlet><!-- servlet-name名字随便写 --><servlet-name>DispatcherServlet</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><!-- 通知DispatcherServlet去指定的⽬录下加载springmvc.xml配置⽂件classpath:是在⼯程的src路径下寻找如果不配置init-param的话,控制器会⾃动寻找/WEB-INF/<servlet-name>-servlet.xml⽂件--><init-param><!-- 值是固定的,相当于键值对 --><param-name>contextConfigLocation</param-name><param-value>classpath:springmvc.xml</param-value></init-param></servlet><servlet-mapping><servlet-name>DispatcherServlet</servlet-name><url-pattern>*.action</url-pattern>//拦截请求</servlet-mapping>注:在默认情况下:springmvc框架的配置⽂件必须叫<servlet-name>-servlet.xml且必须放在/WEB-INF/⽬录下,我们可以在web.xml⽂件中,为DispatcherServlet配置⼀个初始化参数,让它去我们指定的⽬录下加载springmvc.xml配置⽂件2.3配置springmvc.xml注:该配置⽂件的命名规则遵循web.xml⽂件中核⼼控制器配置。

Springcloud学习笔记09-常用注解01@PostMapping、@GetMapp。。。

Springcloud学习笔记09-常用注解01@PostMapping、@GetMapp。。。

Springcloud学习笔记09-常⽤注解01@PostMapping、@GetMapp。

.springframework.web.bind.annotation包下注解1.1 @PostMapping、@GetMapping、@RequestMapping、@RestController、@ResponseBody、@RequestParam、@RequestPart、@PutMapping(1)@RequestMapping@RequestMapping如果没有指定请求⽅式,将接收Get、Post、Head、Options等所有的请求⽅式.(2)@GetMapping@GetMapping是⼀个组合注解,是@RequestMapping(method = RequestMethod.GET)的缩写。

该注解将HTTP Get 映射到特定的处理⽅法上。

get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段⼀⼀对应,在URL中可以看到。

get是从服务器上获取数据。

若符合下列任⼀情况,则⽤GET⽅法:* 请求是为了查找资源,HTML表单数据仅⽤来帮助搜索。

* 请求结果⽆持续性的副作⽤。

* 收集的数据及HTML表单内的输⼊字段名称的总长不超过1024个字符。

(3)@PostMapping@PostMapping是⼀个组合注解,是@RequestMapping(method = RequestMethod.POST)的缩写。

get⽅式的安全性较Post⽅式要差些,包含机密信息的话,建议⽤Post数据提交⽅式;post是向服务器传送数据。

若符合下列任⼀情况,则⽤POST⽅法:* 请求的结果有持续性的副作⽤,例如,数据库内添加新的数据⾏。

* 若使⽤GET⽅法,则表单上收集的数据可能让URL过长。

* 要传送的数据不是采⽤7位的ASCII编码。

(4)@requestBody(后端⽅法接收请求体)@requestBody注解常⽤来处理content-type不是默认的application/x-www-form-urlcoded编码的内容,⽐如说:application/json或者是application/xml等。

Spring知识点详解

Spring知识点详解⼀:概述⼀、简介1. 概念1. Spring是⼀个轻量级的控制反转(IoC)和⾯向切⾯(AOP)的开源容器框架,它由创建。

2. Spring致⼒于提供⼀个以统⼀的、⾼效的⽅式构造整个应⽤,并且可以将单层框架以最佳的组合揉和在⼀起建⽴⼀个连贯的体系。

2. 作⽤:解决企业应⽤开发的复杂性3. 特点1. ⽅便解耦,简化开发:管理所有对象的创建和依赖的关系维护。

2. AOP编程的⽀持:⽅便的实现对程序进⾏权限拦截、运⾏监控等功能。

3. 声明式事务的⽀持:通过配置完成对事务的管理,⽽⽆需⼿动编程。

4. ⽅便程序的测试:Spring对Junit4⽀持,可以通过注解⽅便的测试Spring程序。

5. ⽅便集成各种优秀框架:内部提供了对各种优秀框架的直接⽀持。

6. 降低JavaEE API的使⽤难度:封装JavaEE开发中⾮常难⽤的⼀些API(JDBC、JavaMail、远程调⽤等)。

⼆、体系结构1. 核⼼容器(Core Container)1. Spring-core模块:提供了框架的基本组成部分,包括控制反转(IOC)和依赖注⼊(DI)功能。

2. Spring-beans模块:提供了BeanFactory与Bean的装配,使Spring成为⼀个容器。

3. Spring-context模块:应⽤上下⽂,建⽴在1和2基础之上,提供⼀个框架式的对象访问⽅式,是访问定义和配置任何对象的媒介,使Spring成为⼀个框架。

4. Spring-context-support模块:⽀持整合第三⽅库到Spring应⽤程序上下⽂,特别是⽤于⾼速缓存(EhCache、JCache)和任务调度(CommonJ、Quartz)的⽀持。

4. Spring-expression模块:提供了强⼤的表达式语⾔(扩展的EL)去⽀持运⾏时查询和操作对象图。

2. 中间层1. Spring-aop模块:提供了⼀个符合AOP要求的⾯向切⾯的编程实现,允许定义⽅法拦截器和切⼊点,将代码按照功能进⾏分离,以便⼲净地解耦。

spring3.0学习笔记二---SpEL表达式1

spring3.0学习笔记二---SpEL表达式1相对来讲,java是一门静态语言。

而我们今天要讲的是一门动态“语言”---SpEL。

动态语言和静态语言的最显著差别在于,举个例子," 'Hello'.toUperCase()"这只是一个普通的字符串,差别在于能否把它编译和运行起来得到结果。

就是说动态语言能把一个字符串解释成程序语句。

如果还不是很明白的话没关系,看下面的SpEL例子。

(接下去的我就用例子来做介绍了)public void testSpEL1() {//ExpressionParser是Spring3里的一个包,用来动态解释一个字符串。

ExpressionParser parser = new SpelExpressionParser();Expression exp = parser.parseExpression(" 'Hello,World' ");System.out.println((String)exp.getV alue());}这里'Hello,World' 是一个字符串,解释起来还是一个字符串,所以打印结果是:Hello,World第二个例子:调用方法public void testSpEL2() {ExpressionParser parser = new SpelExpressionParser();Expression exp=parser.parseExpression(" 'Hello'.concat(' World!')"); //这里调用了字符串String的concat 方法//Expression exp=parser.parseExpression("newString('helloworld').toUpperCase()");Stringmessage=(String)exp.getV alue();}第三个例子:调用属性ExpressionParser parser= new SpelExpressionParser();Expression exp=parser.parseExpression("'HelloWorld'.bytes"); //得到字符串的byte//Expression exp=parser.parseExpression("'HelloWorld'.bytes.length"); //得到属性的属性byte [] bytes=(byte[])exp.getV alue();第四个例子:调用类中的属性(下面开始复杂起来了)@Resourcepublic User user; //注入之后,user.getName() 为xiaolingpublic void testSpEL() {//设“值域”,限定在u这个对象里EvaluationContext context = new StandardEvaluationContext(user);ExpressionParser parser = new SpelExpressionParser();Expression exp = parser.parseExpression("username"); //==user.getUsername() System.out.println((String)exp.getV alue(context)); //结果:xiaoling}或者用更简洁的一个方式:System.out.println((String)exp.getV alue(user));这样就不用设值域了!呵呵!第五个例子:给对象中的属性设值StandardEvaluationContext context = new StandardEvaluationContext(user); parser.parseExpression("username").setV alue(context, "ling");第六个例子:做判断Expression exp=parser.parseExpression("name=='xiaoling' ");boolean result=exp.getV alue(context,Boolean.class); //evaluate stotrue打印出来,结果为true看到这,可能你还是一头雾水:这算什么新特性啊,哪有什么用处!用处就在于,SpEL把java变成“动”的了!(纯属我个人观点!!)接下来,我们把SpEL用到bean.xml中去先看个例子(例一)<bean id="numberGuess" class="cn.ling.spel.NumberGuess"><property name="randomNumber" value="#{T(ng.Math).random()*100.0}"/></bean>怎么样,可以在xml文件里面赋值了!呵呵!value里面都用#{}来赋值。

我的spring学习笔记14-容器扩展点之PropertyPlaceholderConfigurer

PropertyPlaceholderConfigurer是个bean工厂后置处理器的实现,也就是BeanFactoryPostProcessor接口的一个实现。

关于BeanFactoryPostProcessor和BeanPostProcessor类似。

我会在其他地方介绍。

PropertyPlaceholderConfigurer可以将上下文(配置文件)中的属性值放在另一个单独的标准java Properties文件中去。

这样的话,我只需要对properties文件进行修改,而不用对xml配置文件进行修改。

作用是什么呢?有一些属性值不需要经常变更,但是有一些属性值可能随时改变,把经常会改动的属性值放在另一个文件中的话,程序使用起来也更方便。

下面将通过一个例子来理解PropertyPlaceholderConfigurer。

首先是配置文件,代码如下:<?xml version="1.0" encoding="UTF-8"?><beans xmlns="xmlns:xsi="xmlns:util="xsi:schemaLocation="<beanclass="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="location" value="propertyPlaceHolder.properties"/></bean><bean id ="student" class="co.jp.beanFactoryPost.Student"><property name="name"><value>${name}</value></property><property name="age"><value>${age}</value></property><property name="birth"><value>${birth}</value></property></bean></beans>在这个配置文件中最重要的就是下面这段代码,<beanclass="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="location" value="propertyPlaceHolder.properties"/></bean>PropertyPlaceholderConfigurer会读取location所设定的属性文件,并将properties文件中的值,设定给${name},${age},${birth}从而完成依赖注入。

【狂神说Java】SpringBoot笔记存档

【狂神说Java】SpringBoot笔记存档转⾃,⾮常感谢⽼师,仅作为个⼈笔记使⽤部分来⾃1、SpringBoot简介:Hello,World!1.1、回顾什么是SpringSpring是⼀个开源框架,2003 年兴起的⼀个轻量级的Java 开发框架,作者:Rod Johnson 。

Spring是为了解决企业级应⽤开发的复杂性⽽创建的,简化开发。

1.2、Spring是如何简化Java开发的为了降低Java开发的复杂性,Spring采⽤了以下4种关键策略:1、基于POJO的轻量级和最⼩侵⼊性编程,所有东西都是bean;2、通过IOC,依赖注⼊(DI)和⾯向接⼝实现松耦合;3、基于切⾯(AOP)和惯例进⾏声明式编程;4、通过切⾯和模版减少样式代码,RedisTemplate,xxxTemplate;1.3、什么是SpringBoot学过javaweb的同学就知道,开发⼀个web应⽤,从最初开始接触Servlet结合Tomcat, 跑出⼀个Hello Wolrld程序,是要经历特别多的步骤;后来就⽤了框架Struts,再后来是SpringMVC,到了现在的SpringBoot,过⼀两年⼜会有其他web框架出现;你们有经历过框架不断的演进,然后⾃⼰开发项⽬所有的技术也在不断的变化、改造吗?建议都可以去经历⼀遍;⾔归正传,什么是SpringBoot呢,就是⼀个javaweb的开发框架,和SpringMVC类似,对⽐其他javaweb框架的好处,官⽅说是简化开发,约定⼤于配置, you can "just run",能迅速的开发web应⽤,⼏⾏代码开发⼀个http接⼝。

所有的技术框架的发展似乎都遵循了⼀条主线规律:从⼀个复杂应⽤场景衍⽣⼀种规范框架,⼈们只需要进⾏各种配置⽽不需要⾃⼰去实现它,这时候强⼤的配置功能成了优点;发展到⼀定程度之后,⼈们根据实际⽣产应⽤情况,选取其中实⽤功能和设计精华,重构出⼀些轻量级的框架;之后为了提⾼开发效率,嫌弃原先的各类配置过于⿇烦,于是开始提倡“约定⼤于配置”,进⽽衍⽣出⼀些⼀站式的解决⽅案。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

spring 学习笔记【篇一:spring 学习笔记】4.主要内容:从下向上看spring 的主要内容:test :spring 支持junit 单元测试核心容器(ioc) :bean(bean 工厂,创建对象)、core( 一切的基础)、context( 上下文)、spel(spring 的表达式语言);aop :aop 、aspects对数据访问的支持:jdbc 、orm 、transaction 、jms(java 邮件服务)对web 的支持:spring mvc5.ioc--inversion of control 控制反转:首先引用一篇文章的内容,简单了解一下dao 和service 层,controller 层、view 层(),另一篇文章对spring ioc 设计思想的总结比较全面和通俗易懂; 第一步:定义dao 接口userdao package cn.sxt.dao;// 降低耦合性public interface userdao{ public void getuser();} 第二步:定义dao 接口的实现类userdaomysqlimpl 和userdaooracleimpl userdaomysqlimpl:package cn.sxt.dao.impl;import erdao;publicclass userdaomysqlimpl implements userdao { @overridepublic void getuser(){ system.out.println(mysql 获取用户数据);}userdaooracleimpl:package cn.sxt.dao.impl;import erdao;publicclass userdaomysqlimpl implements userdao { @overridepublic void getuser(){ system.out.println(mysql 获取用户数据);}第三步:定义service 层接口userservice ,实现具体的业务package cn.sxt.service;public interface userservice { public void getuser();} 第四步:定义service 接口的实现类userserviceimpl,service 层的业务实现,具体要调用到已定义的dao 层的接口我们传统的javase 设计思想,代码是这样组织的:我们直接在对象内部(应用程序本身)通过new 进行创建对象,是程序主动去创建依赖对象package cn.sxt.service.impl;import erdao;importerservice;public class userserviceimplimplements userservice{ // 直接依赖(耦合) private userdaouserdao=new userdaomysqlimpl(); @override public voidgetuser(){ userdao.getuser();} 在我们的测试类test( 可以理解成客户端)中package cn.sxt.test;importerdaomysqlimpl;importerdaooracleimpl;importerserviceimpl;// 原来是在userserviceimpl中创建userdao 对象(应用程序本身)//现在是客户端(调用端)来创建public class test { public static void main(stringargs[]){ userserviceimpl userservice=new userserviceimpl();userservice.getuser();} 如果需要替换dao 接口的具体实现类的时候,我们需要将userserviceimpl 中的private userdao userdao=new userdaomysqlimpl(); 修改为:private userdao userdao=new userdaooracleimpl(); 控制反转(ioc) 的设计思想,我们不需要应用程序本身来创建对象,而是将创建对象的任务交付给ioc 容器:此时,我们在userserviceimpl 可以这样编写代码package cn.sxt.service.impl;import erdao;importerservice;public class userserviceimpl implements userservice{ // 直接依赖(耦合) // private userdaouserdao=new userdaomysqlimpl(); // 瞬间隔离开来privateuserdao userdao=null; public void setuserdao(userdaouserdao) { erdao = userdao; @override public voidgetuser(){ userdao.getuser();} 添加一个set 方法,当调用端需要创建对象的时候,创建具体实现类的对象,此时我们在test 类中就可以这样组织代码:package cn.sxt.test;importerdaomysqlimpl;importerdaooracleimpl;importerserviceimpl;// 原来是在userserviceimpl中创建userdao 对象(应用程序本身)//现在是客户端(调用端)来创建public class test { public static void main(stringargs[]){ userserviceimpl userservice=new userserviceimpl();userservice.setuserdao(new userdaomysqlimpl());userservice.getuser(); system.out.println(----- 分割线------);userservice.setuserdao(new userdaooracleimpl());userservice.getuser();}test 测试类运行结果:mysql 获取用户数据-----分割线------oracle 获取用户数据view code通过上面的例子:1).对象由原来程序本身创建,变为了程序接收对象2).程序员主要精力集中与业务的实现3).实现了service 和dao 的解耦工作,没有直接依赖关系,层与层之间实现了分离(service 和dao 没有关系,完全分离)4).如果dao 的实现发生改变,应用程序本身不用改变(更改spring的配置文件)【篇二:spring 学习笔记】1.在java 开发领域,spring 相对于ejb 来说是一种轻量级的,非侵入性的java 开发框架,曾经有两本很畅销的书《expert one-on-one j2ee design and development 》和《expert one-on-onej2eedevelopment without ejb 》是java 高手进阶必看的宝典,spring 就是从这两本书的理论发展起来的。

spring 主要核心是:(1).控制反转(ioc) :以前传统的java 开发模式中,当需要一个对象时我们,我们会自己使用new 或者getinstance 等直接或者间接调用构造方法创建一个对象,而在spring 开发模式中,spring 容器使用了工厂模式为我们创建了所需要的对象,我们使用时不需要自己去创建,直接调用spring 为我们提供的对象即可,这就是控制反转的思想。

实例化一个java 对象有三种方式:使用类构造器,使用静态工厂方法,使用实例工厂方法,当使用spring 时我们就不需要关心通过何种方式实例化一个对象,spring 通过控制反转机制自动为我们实例化一个对象。

(2).依赖注入(di) :spring 使用java bean 对象的set 方法或者带参数的构造方法为我们在创建所需对象时将其属性自动设置所需要的的过程就是依赖注入的基本思想。

(3).面向切面编程(aop) :在面向对象编程(oop) 思想中,我们将事物纵向抽象成一个个的对象。

而在面向切面编程中,我们将一个个对象某些类的方面横向抽象成一个切面,对这个切面进行一些如权限验证,事物管理,记录日志等公用操作处理的过程就是面向切面编程的思想。

2.在spring 中,所有管理的对象都是javabean 对象,而beanfactory 和applicationcontext 就是spring 框架的两个ioc 容器,现在一般使用applicationncontext ,其不但包含了beanfactory 的作用,同时还进行更多的扩展。

实例化spring ioc 容器的简单方法:(1).方法1:(2).方法2:2.spring 多个配置文件组合方法:很多时候,由于spring 需要管理和配置的东西比较多,如果都放在一个配置文件中,配置文件会变的比较大,同时不方便与维护,一般好的做法是按照功能模块将spring 配置文件分开,例如:dao 层配置到一个spring-dao.xml 配置文件中,service 层配置到spring- service.xml 文件中,struts 的action 配置到spring-action.xml 文件中,然后通过下面两种办法将这些分散的配置文件组合起来:(1).方法1:在一个作为spring 总配置文件中的bean 元素定义之前,通过import 元素将要引入的spring 其他配置文件引入,例如:(2).方法2:a.对于javase 的工程,当使用下面方法获取applicationcontext 对象时将所有的spring 配置文件通过数组传递进去,也可以使用通配符如spring-*.xml 方式。

b.对于javaee 工程,在web.xml 文件中指定spring 配置文件时可以指定多个,中间有逗号“,”分隔,也可以使用通配符方式。

3. spring 配置文件bean 的配置规则:(1).一个bean 可以通过一个id 属性惟一指定和引用,如果spring配置文件中有两个以上相同的id 时,spring 会报错id 冲突。

(2).一个bean 也可以通过一个name 属性来引用和指定,如果spring 配置文件中有两个以上相同name 的bean ,则spring 通过name 引用时,运行时后面的会自动覆盖前面相同name 的bean 引用,而不会报错。

相关文档
最新文档