1. POJO(Plain OldJava Objects)简单的Java对象,实际就是普通JavaBeans,是为了避免和EJB混淆所创造的简称
2. dom4j比jdom强大,都是Java的XML API
3. PO:persistenceobject
4. spring中读取xml文档的部分模拟代码
<beans> <bean id="u" class="com.bjsxt.dao.impl.UserDAOImpl[f1] " /> <bean id="userService" class="com.bjsxt.service.UserService[f2] " > <property name="userDAO" bean="u"[f3] /> </bean>
</beans> |
private Map<String , Object> beans = new HashMap<String, Object>();
public ClassPathXmlApplicationContext() throws Exception { SAXBuilder sb=new SAXBuilder();
Document doc=sb.build(this.getClass().getClassLoader().getResourceAsStream("beans.xml")); //构造文档对象 Element root=doc.getRootElement(); //获取根元素HD List list=root.getChildren("bean");//取名字为disk的所有元素 for(int i=0;i<list.size();i++){ Element element=(Element)list.get(i); String id=element.getAttributeValue("id"); String clazz=element.getAttributeValue("class"); Object o = Class.forName(clazz).newInstance(); System.out.println(id); System.out.println(clazz); beans.put(id, o);
for(Element propertyElement : (List<Element>)element.getChildren("property")) { String name = propertyElement.getAttributeValue("name"); //userDAO String bean = propertyElement.getAttributeValue("bean"); //u Object beanObject = beans.get(bean);//UserDAOImpl instance
String methodName = "set" + name.substring(0, 1).toUpperCase() + name.substring(1); System.out.println("method name = " + methodName);
Method m = o.getClass().getMethod(methodName, beanObject.getClass().getInterfaces()[0]); m.invoke(o, beanObject); } } } |
5. 配置文件中property标签一般都对应后台程序里面的set方法。
6. IOC 也称为DI 控制反转[f4] 依赖注入
7. spring两大核心:IOC和AOP
8. IOC容器作用:
实例化具体bean
动态装配
9. AOP支持什么:
安全检查
管理transaction
10. RC 版, Release Candidate 发布候选版
11. dist版,distribution发布版
经常会有Helios RC2版本这样的,这里RC就是Release Candidate,意为发布候选版本。
还有时会有Eclipse Ganymede SR2 Packages (v 3.4.2) ,这里SR就是:修正版或更新版,修正了正式版推出后发现的Bug。
另外,常见软件中常会见到这些版本:
Trial:试用版,软件在功能或时间上有所限制,如果想解除限制,需要购买零售版。 Retail:零售版。
Free:免费版。
Full:完全版。
Alpha:内部测试版,通常在Beta版发布之前推出。
Beta:测试版,正式版推出之前发布的版本。以上两种测试版本Bug可能较多。
Final:正式版,软件的正式版本,修正了Alpha版和Beta版的Bug
SR:修正版或更新版,修正了正式版推出后发现的Bug。
Pro:专业版,需要注册后才能解除限制,否则为评估版本。
Plus:加强版。
Delux:豪华版。Plus版和Delux版区别不大,比普通版本多了一些附加功能
12. spring中的bean.xml基本内容
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd">
<bean id="u" class="com.bjsxt.dao.impl.UserDAOImpl"> </bean>
<bean id="userService" class="com.bjsxt.service.UserService"> <property name="userDAO" ref="u"[f5] /> <!-- <ref bean=”u”></ref> --> </bean>
</beans> |
13. 尽量用ApplicationContext,是BeanFactory的上层,实现了更多的方法。
ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml"); //BeanFactory ctx = new ClassPathXmlApplicationContext("beans.xml"); |
14. spring初步调用代码
package com.bjsxt.service;
import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.bjsxt.model.User;
//Dependency Injection //Inverse of Control public class UserServiceTest {
@Test public void testAdd() throws Exception { ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
// BeanFactory ctx = new ClassPathXmlApplicationContext[f6] ("beans.xml");
UserService service = (UserService)ctx.getBean("userService");
User u = new User(); u.setUsername("zhangsan"); u.setPassword("zhangsan"); service.add(u); }
} |
15. commons-logging.jar包是使用spring的必备包。
16. 如果在xml文档中不给提示,则可以window-preferences-myeclipse-filesand editors-xml-xml catalog-add。加入对于的xsd后缀的文件,然后选择Schema location,最后在key值后面加上location最后面的文件名(eg:/spring-context-4.0.xsd)。如果自己不配置,myeclipse就会去网上找。
17. IOC:注入类型
1) setter 调用了setXXX方法
2) 构造方法(用的少)
3) 接口注入(基本不用)
<bean id="userService" class="com.bjsxt.service.UserService"> <!-- <property name="userDAO" ref="u" />[f7] --> <constructor-arg><ref bean="u"/></constructor-arg>[f8] </bean> |
18. JMS (Java Message Service)
19. IOC:id vs. name
name可以用特殊字符
<bean id[f9] ="u" class="com.bjsxt.dao.impl.UserDAOImpl"> </bean> |
20. IOC:简单属性的注入,对应简单数据类型(int等)的属性而言的,很少用
<property value[f10] =……> |
21. IOC:bean标签中scope属性,默认情况就是单例
1) singleton单例,不论拿多少次都是同一个对象.
2) prototype每次创建新的对象
22. IOC:集合注入(很少用)具体看参考文档
23. IOC:自动装配,bean标签的autowire属性。默认值为no,不自动装配。
自动装配对应的问题是:我们不手动在bean标签中加property标签的情况下,要装配的类怎么去找对应的bean的问题
1) byName bean的name属性和要装配的类中的属性名一样的情况下自动装配
2) byType 会按类型来查,但是同样类型有多个bean的情况下就会报错
3) 如果所有的bean都用同一种autowire属性值,则可以在beans标签中添加defalt-autowire属性
24. IOC:生命周期
1) lazy_init[f11] :是bean标签的一个属性,如果不加lazy_init=”true”,只要context初始化,一new出:newClassPathXmlApplicationContext("beans.xml"),里面的所有类就初始化了;如果加上lazy_init=”true”,context初始化的时候不初始化这个类,什么时候用的时候(getBean)再初始化。(不重要)
2) init-method destroy-method :类里面有初始化方法和destoy方法,容器初始化这个类的时候要调用初始化方法,容器关闭的时候要调用destory[f12] 方法,这个时候可以配置这两个bean标签的属性。不要和prototype[f13] 一起用(了解)
3) beans标签中也有一个default-lazy-init属性
25. IOC前面讲的配置都可以转换为Annotation,下面将是IOC的Annotation配置。
1) Annotation第一步:
a) 修改xml文件:bean标签还是需要的,只是不需要bean标签里面的ref标签。也就是用xml文档注入。
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">
<context:annotation-config/>[f14] <bean></bean> </beans> |
2) @Autowired:自动装配,加在要注入属性的set方法上面。用的不多容易产生各种各样的问题
a) 默认按类型by type
b) 如果想用byName,使用@Qulifier[f15]
c) 写在private field(第三种注入形式)(不建议,破坏封装)
d) 如果写在set上,@qualifier需要写在参数上
e) 还可以加属性required=false。注入的时候如果没有,也可以。
3) @Required,实例化的时候必须注入,运行之前就检查,可以提早发现错误。写不写均可。如同@override,写了的话可以提早发现错误,在编译期间就能发现错误。
4) @Resource[f16] (重要)importjavax.annotation.Resource;本来要找common.annotation.jar包,但是j2se jdk中好像也已经部分实现了这些标准。故目前先不加,后面再说。
a) 加入:j2ee/common-annotations.jar
b) 默认按名称,名称找不到,按类型
c) 可以指定特定名称
d) 推荐使用
e) 不足:如果没有源码,就无法运用annotation,只能使用xml[f17]
5) @Component[f18] @Service @Controller@Repository
这4个注解目前基本上可以当做是一样的,没什么太大区别。
a) 初始化的名字默认为类名首字母小写
b) 可以指定初始化bean的名字(getBean的时候用的参数)
6) @Scope加在类外面,bean的生存范围。
7) @PostConstruct = init-method; @PreDestroy = destroy-method;加在bean方法前面
26. JSRs:JavaSpecification Requests 在jcp(javaCommunity Process)网站上可以查看具体JSR
27. Common annotations原本是Java EE 5.0(JSR 244)规范的一部分,现在SUN把它的一部分放到了Java SE 6.0中.随着Annotation元数据功能(JSR 175)加入到Java SE 5.0里面,很多Java 技术(比如EJB,Web Services)都会用Annotation部分代替XML文件来配置运行参数(或者说是支持声明式编程,如EJB的声明式事务), 如果这些技术为通用目的都单独定义了自己的Annotations,显然有点重复建设, 所以,为其他相关的Java技术定义一套公共的Annotation是有价值的,可以避免重复建设的同时,也保证Java SE和Java EE 各种技术的一致性
28. AOP:面向切面编程 Aspect-Oriented-Programming
29. 给一个方法前后加逻辑:
源码上加;继承该类,重写该方法;组合,新类里面有个原来对象的引用。
30. 动态代理: jdk proxy invocationhaddler 具体参考
1) InvocationHaddler 是代理实例的调用处理程序实现的接口。要实现这个接口,横切代码加在实现这个接口的类里面。
2) Proxy 可以通过newProxyInstance静态方法来产生代理实例。要动态代理,要先产生被代理对象,然后通过上面实现了InvocationHaddler接口的类里面的构造方法注入,最后new出代理对象,接着就可以根据代理对象动态调用被代理对象的类的接口的方法。
31. new Class[f19] []{target.class}也可以表示为”对象.getClass().getInterfaces()”、表示Class类型的数组,里面装的是通过:类名.forName()、类名.class拿到的Class对象。
32. 动态代理: 需要在多个方法上面都要加业务逻辑的时候,就可以考虑动态代理
代理&