spring是一个轻量级的容器,非侵入性的框架.最重要的核心概念是IOC, 并提供AOP概念的实现方式,提供对持久层,事务的支持, 对当前流行的一些框架(Struts,Hibernate,MVC),Sping也提供了与它们的相整合的方案. 使用Spring,我们能够减少类之间的依赖性和程序之间的耦合度, 最大程度的实现松耦合,使程序更加灵活,可扩展性更强. IOC,中文翻译为"反转控制,".DI->"依赖注入" 指的是:我们不必自己在程序代码中维护对象的依赖关系, 而是通过一个xml配置文件,将类的属性和实例悄悄的注入到类里面. 实现类的动态加载,使得类和类之间可以方便的切换(通过接口). 这种设计方式的思想表现为: 高层模块不应该依赖低层模块,而是模块都必须依赖于抽象. 程序不应改依赖于实现,而是依赖于抽象接口. 应用程序不要去找容器,而是容器给我们所有想要的对象. ApplicationContext FileSystemXmlApplicationContext Resource FileSystemResource BeanFactory XmlBeanFactory Spring的另一个重要的方面是支持AOP的实现: AOP的中文翻译是:面向切面编程,也称为面向问题编程. 我举一个例子........ 通过这种设计方式,可以对类进行监控,实现类的动态代理. java.lang.reflect.InvocationHandler invoke(Object Method,Object[]) 包:core,aop,context,mvc,dao,beans,web,orm spirng获得数据源:org.springframework.jdbc.datasource.DriverManagerDataSource spring访问数据:org.springframework.jdbc.core.JdbcTemplate spring事务处理:org.springframework.jdbc.datasource.DataSourceTransactionManager spring声明事务处理:org.springframework.transaction.interceptor.TransactionProxyFactoryBean <property name="transactionAttributes"> <props> <prop key="create">PROPAGATION_REQUIRED</prop>如果没有事务就新建一个事务 </props> sping和struts 整合: 1.注册声明使用spring代理 struts-config.xml <plug-in className="org.springframework.web.struts.ContextLoaderPlugIn"> <set-property property="contextConfigLocation" value="/WEB-INF/classes/applicationContext.xml/> </plug-in> 2. action path="/GroupAction" name="imForm" type="org.springframework.web.struts.DelegatingActionProxy" 将type改成spring的代理类 3.在applications.xml 注意:name必须和要代理的path一致 <bean name="/GroupAction" class="com.cotel.web.struts.action.security.GroupAction" singleton="false"> <property name="groupBean"> <ref bean="groupBean"/> </property> </bean> 4.在action里面 GroupBeanImpl groupBean public GroupBeanImpl getGroupBean(){ return groupBean; } public void setGroupBean(GroupBeanImpl groupBean){ this.groupBean = GroupBeanImpl groupBean; } 用的时候:getGroupBean()就可以获得实例了. 抽象: 忽略掉一个对象或实体的细节而只关注其本质特征的过程. 封装: 隐藏一个类的数据与实现过程,而只是提供统一的功能调用格式的做法.封装使得类与模块的开发者与使用者在角色上分离开来. 继承: 通过存在的类型定义新类型的机制.提高代码重用. 11.接口的好处? a.实现多继承. b.类和类之间可以动态的切换. c.通过将接口暴露给调用者,能够将接口的实现屏蔽掉.更好的实现封装. spring: core,aop,context,mvc,dao,beans,web IOC:控制反转,依赖注入 AOP:面向切面编程,面向问题编程 针对接口进行编程: 返回值尽量抽象,参数尽量抽象,避免了跟底层的接触,减少程序间的耦合度和类之间的依赖性,使程序更加灵活,可扩展性更强. 依赖注入的目标是为了提升组件重用的概率,并为系统搭建一个灵活,可扩展的平台. 5.AOP是什么? IOC的扩展.对类进行监控,实现类的动态加载. import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.xml.XmlBeanFactory; import org.springframework.core.io.InputStreamResource; //BeanFactory是spring里已经写好的代理类,已经注入依赖 private BeanFactory factory = null; //通过BeanFactory的getBean方法获得实例 //@ id:对应beanFactory.xml里<bean id="">属性 public Object getBean(String id) { return factory.getBean(id); } //利用spring去解析传进来的xml文件 //@ xmlPath:xml文件名 public void init(String xmlPath) throws Exception { InputStream is = new FileInputStream(xmlPath); InputStreamResource isr = new InputStreamResource(is); factory = new XmlBeanFactory(isr); } <?xml version="1.0" encoding="GBK"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans> <!--把encoding=UTF-8改成CBK就可以写中文了--> <!--id=标示符,class="lianxi.Simple"对应class路径--> <bean id="simple" class="lianxi.Simple"> <!--name="say"对应方法名--> <property name="say"> <value>Hello World!</value> </property> </bean> <bean id="demo" class="lianxi.Demo"> <!--name="tall"对应方法名--> <property name="tall"> <value>happay new year !</value> </property> </bean> <bean id="db" class="lianxi.DB"> <!--name="properties": 指setProperties方法.--> <!--<props>里的内容就是setProperties方法参数的值--> <property name="properties"> <props> <prop key="driver">oracle.jdbc.OracleDriver</prop> <prop key="url">oracle:jdbc:thin:@192.168.2.100</prop> <prop key="username">tarena</prop> <prop key="password">tarena</prop> </props> </property> </bean> <bean id="single" class="lianxi.Single" singleton="false"> <property name="data"> <value>happay Spring !</value> </property> </bean> <!--当<bean>里有factory-method属性的时候spring就会去调用属性里的指的方法获得实例,用于单例模式--> <!--<constructor-arg>里的内容就是构造方法里的参数--> <bean id="paramSingle" class="lianxi.ParamSingle" factory-method="getInstance"> <constructor-arg> <value>Hello World !</value> </constructor-arg> <!--<ref bean="db"></ref>引用的类一定要在这个xml里存在--> <constructor-arg> <ref bean="db"></ref> </constructor-arg> <constructor-arg> <!--集合的值可以有多个--> <set> <value>Hello IOC !</value> <value>Hello spring !</value> </set> </constructor-arg> </bean> <bean id="tc" class="lianxi.TestConstructor"> <constructor-arg> <ref bean="single"></ref> </constructor-arg> <constructor-arg> <value>100</value> </constructor-arg> </bean> <bean id="testList" class="lianxi.TestList"> <constructor-arg> <list> <ref bean="db"></ref> </lis </constructor-arg> </bean> <bean id="testMap" class="lianxi.TestMap"> <constructor-arg> <map> <entry key="yup an entry"> <value>just some string</value> </entry> <entry key="db"> <ref bean="db"></ref> </entry> </map> </constructor-arg> </bean> </beans> Hibernate是一个轻量级的持久层开源框架, 它是连接Java应用程序和关系数据库的中间件,负责Java对象和关系数据之间的映射. Hibernate内部对JDBC API进行了封装,负责Java对象的持久化. 因为它封装了所有的数据访问细节,使得业务逻辑层可以专注于实现业务逻辑. 它是一种优秀的ORM映射工具,提供了完善的对象-关系映射服务,开发过程不依赖容器,灵活性非常大,可以无缝集成到任何一个java系统中. 请谈谈JDBC,Hibernate,EJB三者的区别? 这三者都是用做数据持久化操作的. JDBC: 实现业务逻辑的代码和访问数据库的代码混杂在一起,使程序结构不清晰,可读性差. java是面向对象的,sql是面向关系的.两者混在一起,我们不能完全的运用面向对象的思维来编写程序. 业务逻辑和关系数据模型绑定,如果关系数据模型发生变化(如更改表结构),就必须手动修改程序里所有 相关的sql语句,增加了维护软件的难度. 如果sql语句有语法错误,编译是不能检查这种错误,只有运行时才能发现错误,增加了程序的调试难度. EJB: 我们必须遵守复杂的J2EE规范,Hibernate不强迫必须满足特定的规范. EJB只能运行在EJB容器中,Hibernate可以运行在任何java环境中. 2级缓存: session缓存:被称为Hibernate的第一级缓存.它存放被单前工作单元加载的对象. sessionFactory缓存: 被称为Hibernate的第二级缓存.一个实例对应一个数据存储源.它是线程安全的,是重量级的.它需要一个很大的缓存,用来存放预定义的SQL语句以及映射元数据等.
Java程序员Spring相关的面试要点整理
最新推荐文章于 2024-07-24 08:30:00 发布