黑马程序员技术交流社区

标题: 【济南中心】JavaEE框架:spring(一) [打印本页]

作者: 小鲁哥哥    时间: 2017-1-20 11:06
标题: 【济南中心】JavaEE框架:spring(一)
本帖最后由 小鲁哥哥 于 2017-1-20 11:14 编辑

【济南中心】JavaEE框架:spring(一)
技术说明(技术介绍,技术优势以及发展史等)
1.1、什么是spring
l Spring是分层的JavaSE/EE full-stack 轻量级开源框架
        分层:三层体系结构,为每一个层都提供解决方案
                web层:struts2spring-mvc
                service层:spring
                dao层:hibernatemybatisjdbcTemplate(spring)
        轻量级:使用时占用资源少,依赖程序少。比较:EJB
1.2spring由来
Expert One-to-One J2EE Design and Development  ,介绍EJB,使用,特点
Expert One-to-One J2EE Development without EJB ,不使用EJBspring思想
1.3spring核心
l IoCInverse of Control 反转控制)和AOPAspect Oriented Programming 面向切面编程为内核)
1.4spring优点
l 方便解耦,简化开发 (易扩展,易维护)
• Spring就是一个大工厂,可以将所有对象创建和依赖关系维护,交给Spring管理
l AOP编程的支持
• Spring提供面向切面编程,可以方便的实现对程序进行权限拦截、运行监控等功能
l 声明式事务的支持
• 只需要通过配置就可以完成对事务的管理,而无需手动编程
l 方便程序的测试
• SpringJunit4支持,可以通过注解方便的测试Spring程序
l 方便集成各种优秀框架
• Spring不排斥各种优秀的开源框架,其内部提供了对各种优秀框架(如:StrutsHibernateMyBatisQuartz等)的直接支持
l 降低JavaEE API的使用难度
• Spring JavaEE开发中非常难用的一些APIJDBCJavaMail、远程调用等),都提供了封装,使这些API应用难度大大降低
1.5spring体系结构

l spring 核心功能:beanscorecontextexpression
环境搭建(技术开发环境)2.1、获取 Spring framework jar 包  1spring官网下载
从官网下载spring 最新的相关jar包,官网download地址 http://www.springsource.org/springcommunity-download
下载完成后会发现三个目录,命名很明确。  
Docs 目录相关文档。包括一份 API 和一份各种 spring 的使用说明(reference)reference 提供了 HTML.PDF 版本,非常详细。  
2.spring包的核心包
搭建第一个用到 spring 依赖注册的程序  
直接用 eclipse 建立一个 JAVA 项目  
然后添加 spring jar 包引入
spring-core-3.2.0.M1.jar     核心依赖 jar
spring-context-3.2.0.M1.jar   Spring 容器包
spring-beans-3.2.0.M1.jar   Spring beans 的管理包
spring-asm-3.2.0.M1.jar  Spring  
注:和 hibernate 一起用时这个 JAR 会冲突,解决方法删掉它就是了
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in ServletContext resource [/WEB-INF/classes/applicationContext.xml]: Invocation of init method failed; nested exception is java.lang.NoSuchMethodError: org.objectweb.asm.ClassVisitor.visit(IILjava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)
Caused by:  
java.lang.NoSuchMethodError: org.objectweb.asm.ClassVisitor.visit(IILjava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)

spring-expression-3.2.0.M1.jar  
除此之外,还有需要一个 Apache common JAR
注:如果忘记添加会 commons-logging-1.1.1.jar 报错
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory  
commons-logging-1.1.1.jar 日志记录
3. 配置 XML  
Spring 的最大的作用就是提供 bean 的管理功能,在 spring bean 的管理是通过 XML 实现的,要 用此功能,需要把 bean 配置到 spring xml
1. 新建立一个 xml.名字任意,如 applicationContext.xml,或者 text.xml 都可以  2. 添加 xml 头定义
<?xml version="1.0" encoding="utf-8"?>
<beans xmlns=http://www.springframework.org/schema/beans  ①  
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
">
<bean> </bean> </beans>
① Xmlns(XML NameSpace) 声明命名空间,建议是用网址做命名空间,但并不会去访问改网址, 仅仅是 namespace xsdxsd spring 这个 xml schema 文件,里面定义配置内容)里 声明的 targetNamespace 保持一致 . 注:这里命名空间是改不了的,其实是在代码中也写死了,可以打开 spring-beans3.2.0.M1-sources.jar 包的 org\springframework\beans\factory\xml\BeanDefinitionParserDelegate.java 查看对 http://www.springframework.org/schema/beans这个namespace的定义。  
schemaLoacation .用于绑定命名空间的 schema 文件,通常是用 URL 值对,中间用空格隔 开,前面 URL 是命名空间,后面 URL schema 的文件地址
xsd 的存放地址,如果没有声明,eclipse 会去网上下载.  
在创建 xml 时,在 eclipse 编辑 xml 配置没有提示。
可以对 eclipse 中进行 schema 文件的添加
具体是
WindowsàPreferences ,搜索 XML catalog,添加 schema 文件。
Spring schema 文件在下载包里有,找到 spring-3.2.0.M1\schema\beans\spring-beans-3.2.xsd
然后添加,编写 spring 配置文件就能有提示了  
4. 依赖注入 4.1 spring注入的简单案例(入门级)
新建一个 class 用于注入,
package org.beans;  
public class Test { public void say(){
  System.out.println("济南黑马"); } }  
把类通过 xml 配置注入
<?xml version="1.0" encoding="utf-8"?> <beans xmlns="http://www.springframework.org/schema/beans"   xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd">  <bean id="test" class="org.beans.Test" /> </beans>  

测试:
package org.beans;  
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;  
public class testBeans {
public static void main(String[] args) {  
ApplicationContext ctx = new ClassPathXmlApplicationContext("test.xml");   
Test test=(Test) ctx.getBean("济南黑马");  
test.say();  }
}
4.2spring框架为我们提供了三种注入方式,分别是set注入,构造方法注入,接口注入。接口注入不作要求,下面介绍前两种方式。1set注入
  采用属性的set方法进行初始化,就成为set注入。
  1)给普通字符类型赋值。
file:///C:\Users\aa\AppData\Local\Temp\ksohtml\wps8E7F.tmp.png
1. public class User{  
2.    privateString username;  
3.   
4.    publicString getUsername() {  
5.        returnusername;  
6.    }  
7.    publicvoid setUsername(String username) {  
8.       this.username= username;  
9.    }  
10. }  

   我们只需要提供属性的set方法,然后去属性文件中去配置好让框架能够找到applicationContext.xml文件的beans标签。标beans中添加bean标签, 指定id,class值,id值不做要求,class值为对象所在的完整路径。bean标签再添加property 标签,要求,name值与User类中对应的属性名称一致。value值就是我们要给User类中的username属性赋的值。
1. <bean id="userAction"class="com.lsz.spring.action.User" >  
2. <span style="white-space:pre">  </span><property name="username" value="admin"></property>  
3. </bean>  
  2)给对象赋值
同样提供对象的set方法
1. public class User{  
2.      private UserService userservice;  
3.      public UserServicegetUserservice() {  
4.           returnuser;  
5.      }  
6.      public void setUserservice(UserService userservice){  
7.          this.userservice= userservice;  
8.      }  
9. }  
   配置文件中要增加UserService的bean标签声明及User对象对UserService引用。
1. <!--对象的声明-->  
2. <bean id="userService" class="com.lsz.spring.service.UserService"></bean>  
3.   
4. <bean id="userAction"class="com.lsz.spring.action.User" >  
5.    <property name="userservice" ref="userService"></property>  
6. </bean>  
  这样配置,框架就会将UserService对象注入到User类中。
  3)给list集合赋值
同样提供set方法
1. public class User{  
2.     privateList<String> username;  
3.     publicList<String> getUsername() {  
4.         returnusername;  
5.     }  
6.     publicvoid setUsername(List<String> username) {  
7.         this.username= username;  
8.     }  
9. }  

1. <bean id="userAction"class="com.lsz.spring.action.User" >  
2.      <propertynamepropertyname="username">  
3.            <list>  
4.                <value>zhang,san</value>  
5.                <value>lisi</value>  
6.                <value>wangwu</value>                                 
7.                </list>  
8.     </property>  
9. </bean>  

  4)给属性文件中的字段赋值
1. public class User{  
2.     privateProperties props ;  
3.     publicProperties getProps() {  
4.         returnprops;  
5.     }  
6.     publicvoid setProps(Properties props) {  
7.         this.props= props;  
8.     }  
9. }  
file:///C:\Users\aa\AppData\Local\Temp\ksohtml\wps8E8F.tmp.png
1. <bean>  
2.     <propertynamepropertyname="props">  
3.         <props>  
4.            <propkeypropkey="url">jdbc:oracle:thin:@localhost:orl</prop>  
5.            <propkeypropkey="driverName">oracle.jdbc.driver.OracleDriver</prop>  
6.            <propkeypropkey="username">scott</prop>  
7.            <propkeypropkey="password">tiger</prop>  
8.         </props>  
9.     </property>  
10. </bean>  
<prop>标签中的key值是.properties属性文件中的名称
注意:
  无论给什么赋值,配置文件中<property>标签的name属性值一定是和对象中名称一致。
2构造方法注入   1)构造方法一个参数file:///C:\Users\aa\AppData\Local\Temp\ksohtml\wps8E90.tmp.png
1. public class User{  
2.     privateString usercode;  
3.     publicUser(String usercode) {  
4.         this.usercode=usercode;  
5.     }  
6. }  
1. <bean id="userAction"class="com.lsz.spring.action.User">                          
2.     <constructor-argvalueconstructor-argvalue="admin"></constructor-arg>                          
3. </bean>  
   2)构造函数有两个参数时
  当参数为非字符串类型时,在配置文件中需要制定类型,如果不指定类型一律按照字符串类型赋值。
  当参数类型不一致时,框架是按照字符串的类型进行查找的,因此需要在配置文件中制定是参数的位置
1. <constructor-argvalueconstructor-argvalue="admin"index="0"></constructor-arg>                  
2. <constructor-argvalueconstructor-argvalue="23" type="int"index="1"></constructor-arg>  
3.   
  这样制定,就是构造函数中,第一个参数为string类型,第二个参数为int类型
持续更新中。。。





作者: Mr_Maty    时间: 2017-1-20 12:05
虽然不知道是什么,不过mark下

作者: 小虎同学    时间: 2017-1-22 09:49
可以可以可以

作者: 济南王昭珽    时间: 2017-2-4 10:34
非常详细,值得收藏




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2