spring之路

编程入门 行业动态 更新时间:2024-10-21 05:49:30

spring<a href=https://www.elefans.com/category/jswz/34/1770107.html style=之路"/>

spring之路

spring是什么 struts2是web框架(jsp/action)(struts2充当web,接管jsp/action/表单 主要体现出mvc的数据输入、数据的处理,数据的显示分离) hibernate是orm框架,处于持久层 spring是容器框架,用于配置bean,并维护bean之间关系的框架 <spring中有一个非常概念:bean(是java中的任何一种对象  可以是javabean/service/action/数据源/dao),ioc(控制反转 inverse of control) di(dependency injection 依赖注入)> model层(业务层+dao层+持久层  一个项目中不一定同时存在这些层,根据实际情况选择)
ApplicationContext是重量型的,因此要把它做成一个单态的
di配合接口编程 ,可以减少层(web层)和层(业务层)的耦合度
开发一个spring项目: 1>引入spring的开发包(最小配置  spring.jar  该包把常用的jar都包括,还要写日志包common-logging.jar) 2>创建spring的一个核心文件applicationContext.xml,【hibernate有核心  hibernate.cfg.xml struts核心文件  struts-config.xml】,还文件一般放在src目录下,该文件 中引入xsd文件,可以从给出的案例中拷贝一份 3>配置bean       bean元素的作用是:当我们spring框架加载时候,spring就会自动的创建一个bean对象,并放入内存管理起来 (bean中的id就类似于该bean对象的引用  class就直接指向一个类) <bean id="userService" class="com.service.UserService"> <property name="name"> <value>林</value> </property> </bean> 将name属性以及值注入bean(属性必须在指向类里面定义好setter方法)
//实例化spring容器对象,然后通过该对象获取bean对象              ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");              UserService us =(UserService) ac .getBean( "userService" );               us .sayHello(); ioc是什么? 答:ioc控制反转:控制反转就是把创建对象(bean),和维护对象(bean)的关系的权利从程序中转移到spring的容器 (applicationContext.xml)
两种方式获取bean的区别: 使用上下文的方式     当我们去实例化beans.xml,该文件中配置的bean被实例(无论该bean有没有被获取并且该bean的scope是singleton的时候) 从bean工厂方式       当bean被调用时才被实例   BeanFactory factory = new XmlBeanFactory( new ClassPathResource( "com/hsp/ioc/beans.xml" )); 总结:如果使用ApplicationContext,则配置的bean如果是singleton不管你用不用,都被实例化(好处就是可以预先加载,缺点就是耗内存) 如果是BeanFactory,则你实例化该对象时候,配置的bean不会马上实例化,当你使用的时候才被实例(好处节约内存,缺点就是速度) 一般没有特殊要求,应当使用ApplicationContext完成(90%)
三种获取ApplicationContext 对象引用的方式 1>ClassPathXmlApplicationContext->通过类路径     (桌面应用比较多用) 2>FileSystemXmlApplicationContext->通过文件路径 ApplicationContext   ac = new FileSystemXmlApplicationContext( "C:\\Users\\lin\\Workspaces\\MyEclipse 2015\\spring1\\src\\com\\hsp\\ioc\\beans.xml" ); 3>XmlWebApplicationContext     (当Tomcat启动时会自动加载)
bean的生命周期 1>实例化(当我们的程序加载beans.xml),把我们的bean(前提是scope=singleton)实例化到内存 2>调到set方法设置属性 3>如果你实现了bean名字关注接口(BeanNameAware),则可以通过setBeanName获取id号 4>如果你实现了bean工厂关注接口,(BeanFactoryAware),则可以获取BeanFactory 5>如果你实现了ApplicationContextAware接口,则调用方法 //该方法传递ApplicationContext public void setApplicationContext(ApplicationContext arg0) throws BeansException{ System.out.println("ApplicationContext  "+arg0); } 6>如果bean和一个后置处理器关联,则会自动去调用     ObjectpostProcessBeforeInitialization方法 7>如果你实现InitializingBean接口,则会调用afterPropertiesSet 8>如果自己在<bean init-method="init"/>  则可以在bean定义自己的初始化方法 9>如果bean和一个后置处理器关联,则会自动去调用  Object postProcessAfterInitialization方法 10>使用我们的bean 11>容器关闭 12>可以通过实现DisposableBean  接口来调用方法destory 13>可以在<bean destory-method="fun1"/>  调用定制的销毁方法
小结:实际开发中常见的过程是  1>2>6>10>9>11
装配Bean 基本装配:在spring容器内拼凑bean叫装配。装配bean的时候,需要告诉容器哪些bean以及容器如何使用依赖注入将它们配合在一起
使用XML装配:xml是最常见的spring应用系统配置源 几种spring容器都支持xml装配bean,包括: 1>XmlBeanFactory:调用CalssPathResource载入上下文 2>ClassPathXmlApplicationContext:从类路径载入上下文定义文件 3>XmlWebApplicationContext:从web应用上下文中载入定义文件
通过set方法注入依赖 <bean>元素的<property>子元素指明了使用它们的set方法来注入。可以注入任何东西,从基本类型到集合类,甚至是应用系统的bean
java中主要的集合有几种:map set list/数组
数组注入: < property name = "empName" >         < list >               < value > 小明 </ value >               < value > 大明 </ value >               < value > 大大明 </ value >         </ list > </ property >
list注入: < property name = "empList" >         < list >               < ref bean = "emp1" />               < ref bean = "emp2" />         </ list > </ property > </ bean > < bean id = "emp1" class = "com.hsp.collection.Employee" > < property name = "name" value = "北京" /> </ bean > < bean id = "emp2" class = "com.hsp.collection.Employee" > < property name = "name" value = "天津" /> </ bean >
set注入值,set不能有相同的对象 <property name="empsets"> <set> <ref bean="emp1"/> <ref bean="emp2"/> </set> </property>
map注入 <property name="empsets"> <map> <entry key="11" value-ref="emp1"/> <entry key="22" value-ref="emp2"/> </map> </property>

内部bean(可以和引用bean递归使用) <bean id="foo" class="...Foo"> <property name="bar"> <bean name="...Bar"> </property> </bean>
基本装配: 1>继承 2>继承配置 3>覆盖父bean配置 4>可以设置<bean>的abstract属性为true,spring不会实例化该bean
<bean id="gradate" parent="student" class="...Gradate">
< bean id = "student" class = "com.hsp.inherit.Student" >         < property name = "name" value = "冰玉" />         < property name = "age" value = "18" /> </ bean > < bean id = "gradate" parent = "student" class = "com.hsp.inherit.Gradate" >         < property name = "degree" value = "学士" />         < property name = "name" value = "刘冰玉" />         < property name = "age" value = "118" /> </ bean >
给属性集合配置 <property  name="pp"> <pros> <prop key="pp1">abcd</prop> <prop key="pp2">hello</prop> </pros> </property>
给属性注入空值 <property name="barlis"> <null/> </property>

通过构造函数注入值
beans.xml关键代码 < bean id = "employee" class = "com.hsp.constructor.Employee" > < constructor-arg index = "0" type = "java.lang.String" value = "大明" /> < constructor-arg index = "1" type = "int" value = "23" /> </ bean >
会根据属性个数调用对应的构造函数
set注入和构造函数注入对比: set注入的缺点是无法清晰表达哪些属性是必须的,哪些是可选的,构造注入的优势是通过构造强制依赖关系,不可能实例化不完全的或无法使用的bean
自动装配bean的属性值 1、byName(根据属性名自动装配,若找不到,则装不上)
< bean id = "dog" class = "com.hsp.autowire.Dog" > < property name = "name" value = "小黄" /> < property name = "age" value = "3" ></ property > </ bean >                              < bean id = "master" class = "com.hsp.autowire.Master" autowire = "byName" > < property name = "name" > < value > 林 </ value > </ property > </ bean >
2、byType:寻找和属性类型相同的bean,找不到则装不上,找到多个抛出异常 < bean id = "dog11" class = "com.hsp.autowire.Dog" > < property name = "name" value = "小黄" /> < property name = "age" value = "3" ></ property > </ bean >                               < bean id = "master" class = "com.hsp.autowire.Master" autowire = "byType" > < property name = "name" > < value > 林 </ value > </ property > </ bean >
3、constructor:查找和bean的构造参数一致的一个或哆哥bean,若找不到或找到多个,抛异常。按照参数的类型装配
4、autodetect:(3)和(2)之间选一个方式。不确定性的 处理与(3)和(2)一致
5、default:这个需要在<beans default-autowire="指定"/>
6、no:不自动装配,这是autowrite的默认值

AOP编程:对有所对象或者是一类对象编程,核心是(在不增加代码的基础上,还增加功能)
步骤: 1>定义接口 2>编写对象(被代理对象=目标对象) 3>编写通知(前置通知目标方法调用前调用) 4>在beans.xml文件配置 4.1>配置被代理对象=目标对象 4.2>配置通知 4.3>配置代理对象  ProxyFactoryBean的实例 4.3.1>配置代理接口集 4.3.2>织入通知 4.3.3>配置被代理对象
spring的aop中,当你通过代理对象去实现aop的时候,获取的 ProxyFactoryBean是什么类型? 答:返回的是一个代理对象,如果 目标对象实现了接口,则spring使用jdk动态代理技术;如果目标对象没有实现接口,则spring使用CGLIB技术
ssh整合 1>先搞定Spring 2>引入Spring开发包 3>编写beans.xml文件,并把该文件放在src目录下 4>测试一下spring是否ok->编写一个javabean并把它配置在spring的bean中,然后通过实例化容器并且获取该bean和打印bean内容,若成功,则ok 5>加入hibernate开发包 6>因为我们是ssh2,所以hibernate的核心就被spring接管了hibernate.cfg.xml文件对象映射文件,SessionFactory在spring的文件中配置即可 7>在applicationContext.xml中配置数据源 <!-- 配置数据源 --> < bean id = "dataSource" class = "org.apachemons.dbcp.BasicDataSource" destroy-method = "close" >            < property name = "driverClassName" value = "com.mysql.jdbc.Driver" />            < property name = "url" value = "jdbc:mysql://localhost:3306/test" />            < property name = "username" value = "root" />            < property name = "password" value = "123456" />             <!-- 连接池启动时的初始值 -->               < property name = "initialSize" value = "30" />                <!-- 连接池的最大值 -->                < property name = "maxActive" value = "500" />               <!-- 最大空闲值.当经过一个高峰时间后,连接池可以慢慢将已经用不到的连接慢慢释放一部分,一直减少到maxIdle为止 -->               < property name = "maxIdle" value = "2" />               <!--  最小空闲值.当空闲的连接数少于阀值时,连接池就会预申请去一些连接,以免洪峰来时来不及申请 -->               < property name = "minIdle" value = "1" /> </ bean > 8>配置SessionFactory对象 <!-- 配置会话工厂() --> < bean id = "sessionFactory"   class = "org.springframework.orm.hibernate3.LocalSessionFactoryBean" >      <!-- 设置数据源 -->      < property name = "dataSource" ref = "dataSource" />      <!-- 接管了hibernate对象映射文件 -->      < property name = "mappingResources" >            < list >              < value > lin/domain/Course.hbm.xml </ value >              < value > lin/domain/Department.hbm.xml </ value >              < value > lin/domain/Manager.hbm.xml </ value >              < value > lin/domain/Specialty.hbm.xml </ value >              < value > lin/domain/Student.hbm.xml </ value >              < value > lin/domain/Teacher.hbm.xml </ value >            </ list >      </ property >      < property name = "hibernateProperties" >            < value >                     hibernate.dialect=org.hibernate.dialect.MysqlDialect                     hibernate.hbm2ddl.auto=update                            hibernate.show_sql=true                            hibernate.cache.use_second_level_cache=true                  hibernate.cache.provider_class=org.hibernate.cache.EhCacheProvider                  hibernate.generate_statistics=true                </ value >     </ property > </ bean > 9>我们编写domain对象和映射文件xxx.hbm.xml->测试spring和hibernaye是否可以结合使用->ok 10>考虑分层 11>使用事务管理器来统一管理事务 <!-- 配置事务管理器,统一管理sessionFactory的事务 --> < bean id = "txManager" class = "org.springframework.orm.hibernate3.HibernateTransactionManager" >         < property name = "sessionFactory" ref = "sessionFactory" /> </ bean >
12>配置我们的二级缓存 < property name = "hibernateProperties" >            < value >                     hibernate.dialect=org.hibernate.dialect.MySQLDialect                     hibernate.hbm2ddl.auto=update                            hibernate.show_sql=true                            hibernate.cache.use_second_level_cache=true                  hibernate.cache.provider_class=org.hibernate.cache.EhCacheProvider                  hibernate.generate_statistics=true                </ value > </ property >

更多推荐

spring之路

本文发布于:2024-03-23 23:53:26,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1744327.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:之路   spring

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!