您的位置:首页 > 编程语言 > Java开发

maven、java 内存泄漏与spring Ioc DI

2016-03-05 19:14 288 查看
自己以前其实是写c++的,工作之后一直是写shell脚本或者是java程序,也涉及到少量的前端代码,不过基本是照着别人的写,对于它们的特点其实不太知道,像java、spring、maven这些东西知之甚少。这段时间由于各种原因需要对其进行了解,于是乎有了下面的内容。

一、maven。由于最近新开发一个产品,需要于原来产品本体分开,只在数据层做共享,因此service层直接分享,就需要重新写一个项目了,因此终于自己亲自写了一个maven项目并且推到git,而且在服务器上跑通了,期间碰到各种问题,在这里总结一下。

1. 在新建项目的时候就出现问题了,要建的是webapp项目,结果我直接建了两次quickstart,好像是没有web.xml和相应的文件夹WEB-INF吧,忘记了,反正就是不对;

2. 建好了之后就是配置web.xml和appcontext-spring-servlet.xml了,在配置web.xml中这句话的时候,<param-value>classpath*:appcontext-servlet-servlet.xml</param-value>,之前我改同事的一个直接用原生servlet写的web项目弄成spring框架的时候,发现不用加*,结果这里要加*才行,我的appcontext-spring-servlet.xml是放在src/main/resources/spring下面,当然如果放在WEB-INF下面好像是不用配这个param-value。不知道是什么原因导致我可能改了classpath的路径了,汗;

3. 然后就是发现各种找不到pom.xml里面配置的东西,因为少了一个env.properies,里面就一句env=${env},还有就是pom.xml里面的<build><resources></resources><build>中需要配置哪些文件需要用pom.xml中<properties>中配置了值的参数作替换,而且也要将要用的各种.properties、.xml放在resource里面才能通过pom.xml读到;

4. <context:property-placeholder location="classpath*:*.properties,classpath*:${env}-props/*.properties" />,差点忘记了,还少了这一句,因为我需要用到我引用的一个包里的.properities,因此,需要加上这一句才行;

5. 其实这个坑踩的还是因为上面第3点,这是布置到服务器上的时候,发现deploy文件夹没上去,而deploy下面的deploy.sh中变量也没被替换,原来是没加<resource></resource>,加上就好了;

6. <targetPath>${project.build.directory}</targetPath>,这是在配置deploy在pom.xml中的时候,没写好的,结果一开始路径多了个deploy,算是个小坑;

7. 这应该也是个小坑,就是布置脚本deploy.sh中有对执行脚本进行替换并追加内容,结果没注意,导致布到服务器上失败好多次。

8. 应该还有些坑的,记不起来了,以后记起来再添。。。。

二、spring。这个之前也一直想去了解spring框架,可以用了挺久就是没咋了解啥,现在对aop都不了解,之前一次在看帖子的时候看到讲Ioc和DI的,觉得讲的很好,正好这次有个面试,觉得该好好看下,又找出来看了一下,觉得还得把自己的体会写出来,可能深刻点。

1. Ioc。控制反转,是指控制权力的反转,之前的java程序是通过一个类如果要用另一个类的对象,就会new一个,而Ioc则不是这样,由spring容器来创建并控制这些对象的关系。反转,即是指由容器帮助创建及注入依赖对象,而相应的正转就是指自己创建并直接获取依赖对象;

2. DI。依赖注入,我的理解就是将对象之间的依赖关系进行注入,就是某个controller的对象需要依赖其它service的对象,则需要将service的对象实例化并作为controller的依赖对象;

3. Ioc and DI总结。Spring容器会登录所有的类,知道你是什么东西,你需要什么东西,通过依赖注入将这种需要关系注入。而这样,所有对象的创建、依赖关系都由spring控制,就是Ioc了。

三、java内存泄漏。还是因为面试原因,不得不了解些java的考点。内存泄漏应该算是之一了,由于本人至今多数时间还是写的c++,其实对于c++的理解比较深刻一点。由于java的垃圾回收机制,使得两者之间有所区别了。c++内存泄漏的原因,一句话,你申请了堆区内存没主动释放则泄漏了。而java不一样,java的GC会自动回收已经没没程序所需要的对象,比如你创建了两个对象名字为o1、o2,则来一句o1=o2,此时o1原来的对象已经没有引用指向了,程序中没有地方可以用到了,会被GC释放。那么这样不会泄漏,java在什么情况下会有内存泄漏呢,是在有引用,但程序已经不会用到了的时候。

1. Vector等容器中添加了对象,但是是Vector对象指向空的时候,容器中的对象的引用还在,可是GC不知道这些对象的引用是没用的;

2. 监听器。在释放对象的时候忘记释放监听器,这个其实不太理解;

3. 数据库连接。connection需要显示调用close才会收回内存,连接池和单个连接还有所不同;

4. 还有一些由于调用关系导致的。比如A类调用一个函数f,使得函数f中的某个实参B对象产生一个A类的某个变量对象C的引用,则函数结束之后,如果B没有在适当的时候对C的引用进行释放,可能会导致内存的泄漏,这点有些绕,我觉得如果B释放的时候是不是就没有问题了,而如果B不释放,也用不到C了,这时候应该才叫内存泄漏吧,有点不明白,懂的请评论,,,没有的话,等自己以后明白了再更吧。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: