spring随记Word文件下载.docx

上传人:b****5 文档编号:19143328 上传时间:2023-01-04 格式:DOCX 页数:19 大小:26.13KB
下载 相关 举报
spring随记Word文件下载.docx_第1页
第1页 / 共19页
spring随记Word文件下载.docx_第2页
第2页 / 共19页
spring随记Word文件下载.docx_第3页
第3页 / 共19页
spring随记Word文件下载.docx_第4页
第4页 / 共19页
spring随记Word文件下载.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

spring随记Word文件下载.docx

《spring随记Word文件下载.docx》由会员分享,可在线阅读,更多相关《spring随记Word文件下载.docx(19页珍藏版)》请在冰豆网上搜索。

spring随记Word文件下载.docx

files"

System.out.println("

磁盘信息:

"

分区盘符:

+name);

分区容量:

+capacity);

目录数:

+directories);

文件数:

+files);

-----------------------------------"

}

模拟spring容器:

privateMap<

String,Object>

beans=newHashMap<

();

publicClassPathXmlApplicationContext()throwsException{

SAXBuildersaxBuilder=newSAXBuilder();

Documentdocument=saxBuilder.build(this.getClass().getClassLoader().getResourceAsStream("

beans.xml"

ElementrootElement=document.getRootElement();

List<

Element>

elements_children=rootElement.getChildren(“bean”);

for(Elementelement:

elements_children){

Stringid=element.getAttributeValue("

id"

StringclassName=element.getAttributeValue("

class"

System.out.println("

id:

+"

className"

Objectobject=Class.forName(className).newInstance();

beans.put(id,object);

}

publicObjectgetBean(Stringname){

returnbeans.get(name);

for(Elementelement:

+id+"

\tclassName"

+className);

List<

element_properties=element.getChildren("

property"

//可能为空

for(Elementelement_property:

element_properties){

Stringname_property=element_property.getAttributeValue("

Stringname_bean=element_property.getAttributeValue("

bean"

ObjectbeanObject=beans.get(name_bean);

StringmethodName="

set"

+name_property.substring(0,1).toUpperCase()+name_property.substring

(1);

System.out.println("

methodname:

"

+methodName);

Methodmethod=object.getClass().getMethod(methodName,beanObject.getClass().getInterfaces()[0]);

method.invoke(object,beanObject);

}

IOC控制反转(InversionofControl)

DI依赖注入DependencyInjection依赖容器注入service依赖容器给我们注入的DAO实现类service也是依赖容器给我们生成与上面控制反转同一含义反转给容器反转前,控制在自己手里对象由我们生成反转后,控制在容器那,由容器生成对象

以前是写实现,现在是写接口实现类不管,由容器注入面向抽象编程

Spring开发:

1、配置文件

<

beanid="

daoServiceImpl"

class="

com.v512.dao.impl.UserDAOImpl"

>

<

/bean>

struts_action"

com.v512.service.UserService"

<

propertyname="

userDAO"

ref="

/>

2、Jar包

3、初始化容器

BeanFactorybeanFactory=newClassPathXmlApplicationContext("

UserServiceuserService=(UserService)beanFactory.getBean("

 

BeanFactory是更顶层接口,仅仅是一个Bean工厂,功能少

ApplicationContext所能实现的功能更多建议用ApplicationContext

Spring容易有很多种实现方式:

如下

FileSystemXmlApplicationContext

ClassPathXmlApplicationContext

注入类型:

setter

构造方法

接口注入

constructor-argindex="

/constructor-arg>

constructor-argtype="

!

--setter注入,前面已经模拟的很清楚了,UserService必须有该属性的setter方法-->

--

-->

--构造方法注入,UserService必须有含该属性的构造方法-->

constructor-arg>

refbean="

--参考已经有的,bean标签指的是从新new-->

IDVSname

Name里面可以有特殊字符一般不用这个,了解即可

基础类型直接复制

value="

很少用到,将来整合时使用spring提供的它自己写好的Bean时可能用到!

还例如配置数据源,用户名密码连接url数据库驱动等

scope:

Bean的范围

默认:

singleton不论拿多少次这个对象,实际上都是同一个

prototype(原型:

我这里有个原型,谁要是来取的话,我就给它构造一个)

跟web结合的:

只有和其他web框架整合的时候才用,才起作用,但一般不使用。

requestsessionglobalsession

集合的注入:

moreComplexObject"

example.ComplexObject"

--resultsinasetAdminEmails(java.util.Properties)call-->

adminEmails"

props>

propkey="

administrator"

administrator@example.org<

/prop>

support"

support@example.org<

development"

development@example.org<

/props>

/property>

--resultsinasetSomeList(java.util.List)call-->

someList"

list>

value>

alistelementfollowedbyareference<

/value>

myDataSource"

/>

/list>

--resultsinasetSomeMap(java.util.Map)call-->

someMap"

map>

entry>

key>

anentry<

/key>

justsomestring<

/entry>

aref<

/map>

--resultsinasetSomeSet(java.util.Set)call-->

someSet"

set>

/set>

当需要同步时,用Hashtable,反之用HashMap。

但是,因为在需要时,HashMap可以被同步,HashMap的功能比Hashtable的功能更多,而且它不是基于一个陈旧的类的,所以有人认为,在各种情况下,HashMap都优先于Hashtable。

Mapm=Collections.synchronizedMap(newHashMap(...));

《貌似也不推荐,上面有待考证》

Java.util.Properties类是Hashtable的一个子类,设计用于Stringkeys和Stringvalues。

作为put()和get()的替代,你应该用setProperty()和getProperty(),它们用String参数。

Object

setProperty(String 

key,String 

value)

String

getProperty(String 

key)

自动装配:

autowire默认no不自动装配需要手动装配

byNamebyType(按类型查,有多个的话会报错)

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"

web环境下使用spring,会自动的调用destroy方法关闭容器

不要和prototype一起混用spring容器不会去监视prototype类型对象的生存和死亡

1、<

--通过注解方式进行属性装配-->

context:

annotation-config/>

Theimplicitlyregisteredpost-processorsincludeAutowiredAnnotationBeanPostProcessor,CommonAnnotationBeanPostProcessor,PersistenceAnnotationBeanPostProcessor,aswellastheaforementionedRequiredAnnotationBeanPostProcessor

xmlns:

xsi:

声明XMLSchema实例名称空间(http:

//www.w3.org/2001/XMLSchema-instance),并将xsi前缀与该名称空间绑定,这样模式处理器就可以识别xsi:

schemaLocation属性。

用这个属性来引用(schema)模式文档,解析器可以在需要的情况下使用这个文档对XML实例文档进行校验。

它的值(URI)是成对出现的,第一个值表示命名空间,第二个值则表示描述该命名空间的模式文档的具体位置,两个值之间以空格分隔。

当然,在必要情况下,可以为schemaLocation属性指派多个这样的值对。

DTD老的

xsd新的

2、@Autowired不需要引入新的包

@Autowired

publicvoidsetUserDAO(UserDAOuserDAO){

this.userDAO=userDAO;

}自动帮你找一个和setter方法对应类型的(同时找到多个会报错)

publicvoidsetUserDAO(@Qualifier(value="

daoServiceImpl1"

)UserDAOuserDAO){

}按名称!

不建议写在属性上(spring注入的第三种方式接口注入破坏了封装性不建议使用)

可以写在任意方法上,在调用该方法的时候帮你注入进去

如果写在set上,@Qualifier需要写在参数上

@Autowired(required=false)本来应该注入,可不是必须的,没有也没关系

@Required初始化的时候必须注入

@Resource注解

Jar包spring>

lib>

j2ee中common-annotations.jar

不指定名称时,默认按名称(属性,或者参数的名称),名称找不到按类型。

指定名称时,只能按名称

@Resource(name="

--开启自动管理和扫描-->

component-scanbase-package="

com.mall"

/context:

component-scan>

写了这个,配置文件中对于bean的配置就基本没有了!

@Component

@Component("

@Component(value="

)初始化的名字默认为类名首字母小写

@Component,@Repository,@Service,@Controller

目前版本,这4个注解没有任何区别

@Scope("

)@PostConstruct@PreDestroy

@Service(value="

publicclassUserService{

privateUserDAOuserDAO;

//面向抽象编程,以前是写实现,现在是写接口

publicUserService(){

@PostConstruct

publicvoidinit(){

System.out.println("

init!

@PreDestroy

publicvoiddestory(){

destory!

继承(能不用尽量不用继承:

不能在继承其他类,父类改了子类必须得改,耦合性太强)

组合代替继承,形成一种新的设计模式,更加灵活

用JDK实现动态代理的话,这个类必须实现一个接口

没有实现接口的类,JDK是给它产生不了动态代理的,但是hibernate是能产生的。

(直接去修改它的二进制码)

面向切面编程动态代理实现面向对象编程之后的一个伟大的思想

应用:

权限日志审查代码执行效率的检查

Spring类没有实现接口的话也可以实现动态代理内部实现:

直接生成二进制码用继承

aop:

aspectj-autoproxy>

/aop:

自动的帮我去产生代理,只要在spring的容器启动过程中,它扫描到一个东西,需要产生代理,它就会帮你产生代理。

内部实现:

aspectj一个专门用来实现代理的框架面向切面的框架

2、类库

3、要想把切面中的方法织入进某个对象的某个方法,首先那个对象必须被spring管理起来的

4、@Aspect@Before("

execution(publicvoidcom.v512..*.save(..))"

5、织入点语法execution是专门的方法的切入语法

切入点:

@Pointcut:

连接点的集合,它有一个名字

连接点joinpoint

Advice加在切入点上的建议

Targetweave

@Before("

publicvoidbefore(){

methodstart!

}

@Pointcut("

privatevoidbeforeMethod(){}

beforeMethod()"

自己写切面类的可能性比较小

execution(voidcom.v512..*.save(..))"

@Aspect

publicclassAroundExample{

@Around("

com.xyz.myapp.SystemArchitecture.businessService()"

publicObjectdoBasicProfiling(ProceedingJoinPointpjp)throwsThrowable{

//startstopwatch

ObjectretVal=pjp.proceed();

//stopstopwatch

returnretVal;

返回值还可以是void和非void!

void

Afterfinally

AfterReturningreturn

AfterThrowingcatch

privatevoidMethod(){}

@Before("

Method()"

publicvoidbefore(){

@AfterReturning("

publicvoidafter(){

methodafterReturning!

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1