第43周星期三收获
- 今天发现word的引用功能可以不显示文章中的批注功能很好,好友审阅模式也很好,可以列出所有的批注,省的一篇很长的文章需要多次才能看到要找的批注。
- 今天发现MyEclipse是可以自定义快捷键的,keys里面设置就行了,尝试了几下但有时不好用,可能跟快捷键重复和所在窗口有关。明天尝试把其配置数据导出,修改后再导入试试。工具使用上有几点心得(1)把MyEclipse中启动是不需要的组件加载全部去掉了,减少了启动时内存占用,也加快了启动速度。(2)配置修改了xml文件打开方式,加快了打开的速度。(3)发现了ctrl+O快捷键可以搜索要查找的类方法,更简单快捷。Ctrl+K定义下一个要查找的单词。还有其它几个有用的ctrl+shift+x快捷键。
- Spring的配置使用思考:Spring组件实现了Tomcat容器的接口,容器启动时加载Web.xml配置文件时加载了Spring的配置文件,然后利用相关配置文件中的一些Bean进行工作。看了一些Spring教程和Spring知识点总结,转载http://blog.csdn.net/billycoder/article/details/6949788内容如下
Spring的技术核心。
Spring 是一个开源的:控制反转(Inversion of control )IOC ,依赖注入(Dependency Injection )和面向切面(Aop)的框架,它主要的目的是简化企业的开发。
2. 控制反转
所谓控制反转就是:应用本身不负责依赖对象的创建与维护,依赖对象的创建与维护是有外部容器负责的。这样控制权就有应用转向了外部容器,控制权的转移就是所谓的控制反转。
3. 依赖注入
所谓依赖注入就是指: 在运行期 由外部容器动态的将依赖对象注入到组件中。
4. 为什么要使用Spring 呢
<a>可以降低组件之间的耦合度,实现软件各层之间的解耦;
Control----àService----àDAO
<b>使用Spring 容器可以使用它提供的众多服务:事务管理服务,JMS服务,Spring Core服务,持久化服务,其它......
事务管理: 不需要手工控制事物
<c>容器提供单利模式支持;
<d>容器提供了AOP技术,利用它很容易实现如:权限拦截,运行期监控等功能。
<e>容器提供了很多的辅助类,使用这些类能够加快应用的开发,如: Jdbc Template,
HibernateTemplate 。
<f>Spring对主流的应用框架提供了支持如: Hibernate ,JPA , Struts.等。
5. 实例化Spring 容器
两种方式
A : 在类路径下寻找配置文件来实例化Spring容器。ApplicationContext继承sessionfactory,所以不用sessionfactory
ApplicationContext ctx = new ClassPathXmlApplicationContext("config-path");
如果是两个以上:
ApplicationContext ac = new ClassPathXmlApplicationContext(new String[]{"applicationContext.xml","dao.xml"});
或者用通配符:
ApplicationContext ac = new ClassPathXmlApplicationContext("classpath:/*.xml");
B:在文件系统路径下寻找配置文件来实例化Spring 容器;
ApplicationContext ctx = new FileSystemXmlApplicationContext("d:\\bean.xml");
注: 第二种方式通常在本地测试时用,因为每个应用的配置在不同机器上会不同。
Spring 的配置文件可以通过String 类型的数组配置多个。
然后就可以通过
OrderService service = (OrderService)ctx.getBean("personService");
6. dom4j读解析xml文件
public class ItcastClassPathXmlApplicationContext {
private List<BeanDefinition> beanDefines = new ArrayList<BeanDefinition>();
public ItcastApplicationContext(String filename){
init(filename);
}
private void init(String filename){
SAXReader saxReader = new SAXReader();
Document document=null;
try{
URL xmlpath = this.getClass().getClassLoader().getResource(filename);
document = saxReader.read(xmlpath);
Map<String,String> nsMap = new HashMap<String,String>();
nsMap.put("ns","http://www.springframework.org/schema/beans");//加入命名空间
XPath xsub = document.createXPath("//ns:beans/ns:bean");//创建beans/bean查询路径
xsub.setNamespaceURIs(nsMap);//设置命名空间
List<Element> beans = xsub.selectNodes(document);//获取文档下所有bean节点
for(Element element: beans){
String id = element.attributeValue("id");//获取id属性值
String clazz = element.attributeValue("class"); //获取class属性值
BeanDefinition beanDefine = new BeanDefinition(id, clazz);
beanDefines.add(beanDefine);
}
}catch(Exception e){
e.printStackTrace();
}
}
7. Spring配置文件中bean 的属性
Bean 可以有id , name..... 其中id 时唯一的,不可以包含特殊字符。而name可以包含特殊字符。
8. 常用实例化bean的方法
使用构造方法来实例化bean <bean id="bean-name" class="类路径">通过默认的构造方法来实例化bean对象;
其它不常用的不介绍
9. 每次通过Spring容器来获得的bean是同一个对象吗
bean的属性scope="prototype",可以让每次实例化的bean对象不同
默认容器启动就会实例化bean, bean的属性lazy-init="true"改变这种情况
进行全局设置:<beans default-lazy-init="true">.......</beans>.
10. Spring中的其它配置
<bean init-method="方法名称"> </bean>这样会在bean实例化之后执行初始化方法。
既然有初始化方法,那么Spring 也会有销毁的方法。可以这样指定:
<bean destroy-method="方法名"></bean>
我们可以通过正常的方式来关闭Spring 容器:
AbstractApplicationContext ctx = new ClassPathXmlApplicationContext();
Ctx.close(); //关闭容器
11. Spring中依赖注入的几种方式
基本类型的注入方式:
<bean id="bean-name" class="classPath">
<property name="atttibute-name" value="value1"></property>//set方式
<constructor-arg index="0"type="java.lang.String" value="xxxxx">//构造方方式,index="0"是构造方法的第一个参数,也可以根据type指定参数
</constructor-arg>
</bean>
注入其它bean:
方式1: 通过属性,设置Setter()方法来注入;这个属性一般式接口形式的。
<bean id="bean-name1" class="classpath"></bean>
<bean id="bean-name2" class="classPath">
<property name="name1" ref=" "bean-name1"/>//对象的引用
</bean>
方式 2:使用内部bean 但是该bean不能被其它bean使用;
<bean id="bean-name1" class="classpath"></bean>
<property name="name1">
<bean id="name2" class="classPath"></bean>//产生一个新的对象
</property>
</bean>
12. 如何为注入集合类型对象(不重要)
Set List Map Peoperty
<bean id="" ...>
<property name="list">
<list>
<value>1</value>
</lsit>
</property>
</bean>
set和list没区别
<bean id="" ...>
<property name="map">
<map>
<entry key="a" value="1"/>
</map>
</property>
</bean>
13. 用注解的方式进行依赖注入
需要引入命名空间,和如果要想出现提示信息还要添加schema文件。在上图中有详细的说明。
14. 在spring中使用注解进行IOC
然后在bean.xml中写入
<aop:aspectj-autoproxy/> <!—和建立代理有关-->
15. 注入方式
@Autowired:默认是byType,配合Qualifier可以指定name
@Resource:默认byName,找不到byType
@resource需要导入spring->lib->j2ee->common-annotaion.jar
异常处理一般在struts这层处理,spring很少处理异常
指定默认扫描方式:
<benan id="bean-name" class="class-path" autowire="default">
autowire取值如下:byType; byName; constructor; Autaodetect 16.通过classpath自动扫描的方式把组件注入到spring容器中管理;
注册解析注解的解析器;
<context:annotation-config />
注册注解的解析器同样也包括上面的范围,故有下面的配置时上面的配置可以不要;
<context:component-scan base-package="wto.bean" />
这种方法也可以通过注解来设定初始化方法,销毁方法,也可以指定bean的名称。
@Servic 业务层组件
@Controller 控制层组件
@Repositiory 数据访问层组件 以上三种组件目前还没有区别可以随便用。
@Component 泛指组件 当组件不好归类的时候我们可以使用这个注解进行标注。
@Scope 设置bean的模式是(单利)single 还是proptoto(原型)
以上注解都是标注在类上的
下面的注解是标注在方法上的:
@PostConstruct 设定初始化方法
@PreDestroy 设定销毁的方法
16. 在spring中使用AOP(面向切面编程)
动态代理:被代理对象要组合到代理类.代理类要实现invacationhandler. 用proxy.newInstance()返回的对象.但是hibernate中的动态代理是直接操作的二级制码,spring也类似,所以需要引入cglib相关包
17.AOP中的一些概念:Aspect(切面),joinpoint(连接点),Pointcut(切入点)Advicce(通知)Target(目标对象),Weave(织入),Introduction(引入)
18.基于注解方式声明切面,但是AOP用xml好,IOC用annotation好
19.Spring对数据库的支持
hibernate对数据库的支持DPCP,需要导入common-dbcp.jar;common-pool.jar
<bean id=" myDateSource >
class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="dirverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/spring/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</bean>
<bean id="mySessionFactory" class="org.springframework.orm.hibernate3. AnnotationSessionFactoryBean >
<--用注解必须是这个接口而不是LocalSessionFactory-->
<property name="dateSource ref="myDateSource"/>
<property name="mappingResources">
<list>
<value>product.hbm.xml</value>
</list>
<property name="hibernateProperties>
<value>
hibernate.dialect=org.hibernate.dialect.HSQLDialect
</value>
</property>
</bean>
可以用占位符和property文件配合使用
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<value>classpath:jdbc.perperties</value>
</property>
</bean>
<bean id="dateSource" destroy-mothod="close">
<property name="dirverClassName" value="${jdbc.driverClassName}/>
<property name="url" value="${jdbc.url}/>
<property name="username" value="${jdbc.username}/>
<property name="password" value="${jdbc.password}/>
</bean>
jdbc.properties
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/spring
jdbc.username=root
jdbc.password=root
JDBC+spring整合开发的时候就可以用其实还可以,用如下的方法
<bean id="txtManager" class="org.springframework.jdbc.datesource.DateSourceTransactionManager>
<property name="dateSource" ref="dateSource"/>
</bean>
补充:属性文件还可以用下面方式赋值
<property name="adminEmails">
<props>
<prop key"adminstrator">adminstrator@example.org</prop>
<prop key="support"> support@example</prop>
</props>
</property>
20 . Spring支持事务管理
首先修改配置,和加入相应的schema
<tx:annotaion-driven transaction-manager="txtManager">
<bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTrasactionManager>
<property name="sessionFatory ref="sessionFactory"/>
</bean>
使用@Transactional
@Transactional
public void add(User user){
userDAO.save(user);
Log log = new Log();
Log.setMsg("a user saved!");
LogDAO.save(log);
}
现在假如手动throw new RuntimeException("testerror");事务就会回滚了
propagation:是衍生,繁殖,就是事务的传播方式;
默认是REQUESTED,还有其他值,这个做了解
MANDTROY,NESTED,NEVER,NOT_SUPPORTED,REQUESTES_NEW,SUPPORTS
- Java Bean
Spring是基于JavaBean的,所以想弄明白JavaBean的概念,想知道为什么叫Bean这个名字的由来,但没搜索找到答案, Bean英文含义豆子,也许就是想表达重用组件的含义。软件组件就是指可以进行独立分离、易于重复使用的软件部分。JavaBean就是一种基于Java平台的软件组件思想。JavaBean也是一种独立于平台和结构的应用程序编程接口(API)。bean跟javabean是一样的概念,知识不同场合的不同叫法。
bean、javabean本质上是一个由java文件生成的类,按照sun的说法,一个组件即java应用程序或applet的重复使用的部件就是bean
我觉得可以简单的把它理解为:符合一定规范的java类,所以你就可以像理解类一样来理解javabean.就是说javabean就是java中比较特殊的类,我们另外起个名字把它叫做javabean.跟其它语言类比的话,可以把它理解为其他语言里面的控件。bean类似与微软的COM组件,bean组件是java类,这些类遵循一些接口格式,以便于使方法命名,底层行为以及继承或实现的行为能够把类看作是标准的bean组件方式进行构造
下面转一篇很有启发的文章:http://blog.csdn.net/xiazdong/article/details/6888024
一、JavaBean出现的目的
由于只用JSP开发会发现使用了很多的Scriptlet,会使得jsp文件非常混乱。如果使用了JavaBean,则可以大大减少JSP中代码量。
JSP的理想状态是只负责显示,而不负责处理。
二、JavaBean介绍
JavaBean说的通俗点就是一个Java类用于JSP中。通过<jsp:useBean>或者import导入。
JavaBean导入的类的约定:
(1)类必须是public的;
(2)必须有无参构造;
(3)属性必须是private的;
三、JavaBean存放位置
在tomcat中的理想目录结构如下:
JavaBean存放在WEB-INF/classes内。
注意:
(1)每次修改classes文件或web.xml后必须要重启服务器。
如果觉得很麻烦,则在开发过程中可以通过在Server.xml中设置虚拟目录的位置添加:
<Context path="..." docBase="..." reloadable="true"/>,这样就会变成自动导入模式,不必重启服务器。
但是有一个缺点,就是服务器必须时刻监视,会降低性能。
(2)在classes中放入的是class文件。
(3)类必须要有所在的包。
四、<jsp:useBean>用法:
一般的形式:<jsp:useBean id="实例化名称" scope="page" class="完整类名称"/>
id中是实例化对象;
scope中可以是
(1)page:在一页中保存
(2)request:服务器端跳转仍保存;
(3)session:跳转仍保存;
(4)application:服务器没有关闭仍保存;
class为实例化对象的类的完整名称;
使用<jsp:useBean>的好处是自动帮助你创建一个名为id的值的对象。
注意:JavaBean中一定要有无参构造函数。
五、<jsp:setProperty>用法:
一般形式有四种:
(1)<jsp:setProperty name="实例化名称" property="*"/>:自动调用set方法;
(2)<jsp:setProperty name="实例化名称" property="name1"/>:对于name1属性自动调用set方法;
(3)<jsp:setProperty name="实例化名称" property="name1" value="value1"/>:对于name1属性赋予value1值;
(4)<jsp:setProperty name="实例化名称" property="name1" param="param1"/>:把param1的值赋给name1属性;
但是一般使用第一种方法最多。
六、<jsp:getProperty>用法
一般形式:<jsp:getProperty name="c1" propety="name1"/>自动调用c1对象的getName1()方法,并返回;
其实效果和getter方法是一样的;
七、JavaBean删除
通过pageConext.removeAttribute("JavaBean名称");删除scope为page的JavaBean对象。依次类推。