1、files System.out.println(磁盘信息:分区盘符:+name);分区容量:+capacity);目录数:+directories);文件数:+files);- 模拟spring容器:private Map beans = new HashMap(); public ClassPathXmlApplicationContext() throws Exception SAXBuilder saxBuilder = new SAXBuilder(); Document document = saxBuilder.build(this.getClass().getClassLoad
2、er().getResourceAsStream(beans.xml Element rootElement = document.getRootElement(); List elements_children = rootElement.getChildren(“bean”); for(Element element : elements_children) String id = element.getAttributeValue(id String className = element.getAttributeValue(class System.out.println(id: +
3、className Object object = Class.forName(className).newInstance(); beans.put(id, object); public Object getBean(String name) return beans.get(name);for(Element element : + id + tclassName + className); List element_properties = element.getChildren(property/可能为空 for(Element element_property : element_
4、properties) String name_property = element_property.getAttributeValue( String name_bean = element_property.getAttributeValue(bean Object beanObject = beans.get(name_bean); String methodName = set + name_property.substring(0, 1).toUpperCase() + name_property.substring(1); System.out.println(method na
5、me: + methodName); Method method = object.getClass().getMethod(methodName, beanObject.getClass().getInterfaces()0); method.invoke(object, beanObject); IOC 控制反转(Inversion of Control)DI 依赖注入 Dependency Injection 依赖容器注入 service依赖容器给我们注入的DAO实现类 service也是依赖容器给我们生成 与上面控制反转同一含义 反转给容器 反转前,控制在自己手里 对象由我们生成 反转
6、后,控制在容器那,由容器生成对象以前是写实现,现在是写接口 实现类不管,由容器注入 面向抽象编程Spring开发:1、配置文件 struts_actioncom.v512.service.UserService 2、Jar包3、初始化容器BeanFactory beanFactory = new ClassPathXmlApplicationContext(UserService userService = (UserService)beanFactory.getBean(BeanFactory是更顶层接口,仅仅是一个Bean工厂,功能少 ApplicationContext所能实现的功能更多
7、 建议用 ApplicationContextSpring容易有很多种实现方式 :如下FileSystemXmlApplicationContextClassPathXmlApplicationContext注入类型:setter构造方法接口注入constructor-arg index=/constructor-argconstructor-arg type=!- setter注入,前面已经模拟的很清楚了,UserService必须有该属性的setter方法 - 构造方法注入,UserService必须有含该属性的构造方法 -constructor-argref bean=- 参考已经有的,
8、 bean标签指的是从新new -ID VS nameName里面可以有特殊字符 一般不用这个,了解即可基础类型直接复制 value=很少用到,将来整合时使用spring提供的它自己写好的Bean时可能用到! 还例如配置数据源,用户名 密码 连接url 数据库驱动等scope : Bean的范围默认:singleton 不论拿多少次这个对象,实际上都是同一个prototype (原型:我这里有个原型,谁要是来取的话,我就给它构造一个)跟web结合的: 只有和其他web框架整合的时候才用,才起作用,但一般不使用。request session global session 集合的注入:moreC
9、omplexObjectexample.ComplexObject- results in a setAdminEmails(java.util.Properties) call -adminEmailspropsprop key=administratoradministratorexample.orgsupportsupportexample.orgdevelopmentdevelopmentexample.org/property- results in a setSomeList(java.util.List) call -someListlistvaluea list element
10、 followed by a referencemyDataSource /list- results in a setSomeMap(java.util.Map) call -someMapmapentrykeyan entryjust some stringa ref- results in a setSomeSet(java.util.Set) call -someSetset/set当需要同步时,用Hashtable,反之用HashMap。但是,因为在需要时,HashMap可以被同步,HashMap 的功能比Hashtable的功能更多,而且它不是基于一个陈旧的类的,所以有人认为,在各
11、种情况下,HashMap都优先于Hashtable。Map m = Collections.synchronizedMap(new HashMap(.);貌似也不推荐,上面有待考证Java.util.Properties类是Hashtable的一个子类,设计用于String keys和String values。作为 put()和get()的替代,你应该用setProperty()和getProperty(),它们用String参数。ObjectsetProperty(Stringkey, Stringvalue) StringgetProperty(Stringkey) 自动装配:autow
12、ire 默认no 不自动装配 需要手动装配byName byType(按类型查,有多个的话会报错)default 指的是使用在default-autowire中指定好的属性值不常用自动装备:不可预知性autowire写在bean标签上 同样 default-autowire可以写在beans上 对所有bean起作用 scope=singleton autowire=default生命周期:lazy-init容器初始化的时候它不进行初始化使用到它的时候在进行初始化beans 中default-lazy-init 很少用init-method=init destroy-method=destory
13、web环境下使用spring,会自动的调用destroy方法关闭容器不要和prototype一起混用 spring容器不会去监视prototype类型对象的生存和死亡1、context:annotation-config/The implicitly registered post-processors include AutowiredAnnotationBeanPostProcessor, CommonAnnotationBeanPostProcessor, PersistenceAnnotationBeanPostProcessor, as well as the aforementio
14、ned RequiredAnnotationBeanPostProcessorxmlns:xsi:声明XML Schema实例名称空间(http:/www.w3.org/2001/XMLSchema-instance),并将xsi前缀与该名称空间绑定,这样模式处理器就可以识别xsi:schemaLocation属性。用这个属性来引用(schema)模式文档,解析器可以在需要的情况下使用这个文档对 XML 实例文档进行校验。它的值(URI)是成对出现的,第一个值表示命名空间,第二个值则表示描述该命名空间的模式文档的具体位置,两个值之间以空格分隔。当然,在必要情况下,可以为 schemaLocat
15、ion 属性指派多个这样的值对。DTD老的xsd新的2、Autowired不需要引入新的包Autowired public void setUserDAO(UserDAO userDAO) this.userDAO = userDAO; 自动帮你找一个和setter方法对应类型的(同时找到多个会报错) public void setUserDAO(Qualifier(value = daoServiceImpl1) UserDAO userDAO) 按名称!不建议写在属性上 (spring注入的第三种方式 接口注入 破坏了封装性 不建议使用)可以写在任意方法上,在调用该方法的时候帮你注入进去如
16、果写在set上,Qualifier需要写在参数上Autowired(required=false) 本来应该注入,可不是必须的,没有也没关系Required初始化的时候必须注入Resource注解Jar包 spring lib j2ee中 common-annotations.jar不指定名称时,默认按名称(属性,或者参数的名称),名称找不到按类型。 指定名称时,只能按名称Resource(name = )- 开启自动管理和扫描 -component-scan base-package=com.mall/context:component-scan写了这个,配置文件中对于bean的配置就基本没
17、有了!ComponentComponent(Component(value = ) 初始化的名字默认为类名首字母小写Component, Repository, Service, Controller目前版本,这4个注解没有任何区别Scope() PostConstruct PreDestroyService(value=public class UserService private UserDAO userDAO;/面向抽象编程,以前是写实现,现在是写接口 public UserService() PostConstruct public void init() System.out.pr
18、intln(init! PreDestroy public void destory()destory!继承 (能不用尽量不用继承:不能在继承其他类,父类改了子类必须得改,耦合性太强)组合代替继承,形成一种新的设计模式,更加灵活用JDK实现动态代理的话,这个类必须实现一个接口没有实现接口的类,JDK是给它产生不了动态代理的,但是hibernate是能产生的。(直接去修改它的二进制码)面向切面编程 动态代理实现 面向对象编程之后的一个伟大的思想应用: 权限 日志 审查 代码执行效率的检查Spring 类没有实现接口的话也可以实现动态代理 内部实现: 直接生成二进制码 用继承aop:aspectj
19、-autoproxy/aop:自动的帮我去产生代理,只要在spring的容器启动过程中,它扫描到一个东西,需要产生代理,它就会帮你产生代理。内部实现:aspectj 一个专门用来实现代理的框架 面向切面的框架2、 类库 3、 要想把切面中的方法织入进某个对象的某个方法 ,首先 那个对象必须被spring管理起来的4、 Aspect Before(execution (public void com.v512.*.save(.)5、 织入点语法 execution 是专门的方法的切入语法切入点:Pointcut :连接点的集合,它有一个名字连接点 joinpointAdvice 加在切入点上的建
20、议Target weaveBefore(public void before()method start!Pointcut(private void beforeMethod() beforeMethod()自己写切面类的可能性比较小execution (void com.v512.*.save(.)Aspectpublic class AroundExample Around(com.xyz.myapp.SystemArchitecture.businessService() public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable / start stopwatch Object retVal = pjp.proceed(); / stop stopwatch return retVal;返回值还可以是void 和非void !voidAfter finallyAfterReturning returnAfterThrowing catch private void Method() Before(Method() public void before() AfterReturning( public void after()method afterReturning!