spring四种依赖注入方式

平常的java开发中,程序员在某个类中需要依赖其它类的方法,则通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理,spring提出了依赖注入的思想,即依赖类不由程序员实例化,而是通过spring容器帮我们new指定实例并且将实例注入到需要该对象的类中。依赖注入的另一种说法是“控制反转”,通俗的理解是:平常我们new一个实例,这个实例的控制权是我们程序员,而控制反转是指new实例工作不由我们程序员来做而是交给spring容器来做。 spring有多种依赖注入的形式,下面仅介绍spring通过xml进行IOC配置的方式: Set注入 这是最简单的注入方式,假设有一个SpringAction,类中需要实例化一个SpringDao对象,那么就可以定义一个private的SpringDao成员变量,然后创建SpringDao的set方法(这是ioc的注入入口): Java代码   package com.bless.springdemo.action; public class SpringAction {         //注入对象springDao     private SpringDao springDao;         //一定要写被注入对象的set方法         public void setSpringDao(SpringDao springDao) {         this.springDao = springDao;     }         public void ok(){         springDao.ok();     } } 随后编写spring的xml文件,<bean>中的name属性是class属性的一个别名,class属性指类的全名,因为在SpringAction中有一个公共属性Springdao,所以要在<bean>标签中创建一个<property>标签指定SpringDao。<property>标签中的name就是SpringAction类中的SpringDao属性名,ref指下面<bean name="springDao"…>,这样其实是spring将SpringDaoImpl对象实例化并且调用SpringAction的setSpringDao方法将SpringDao注入: Java代码   <!--配置bean,配置后该类由spring管理-->     <bean name="springAction" class="com.bless.springdemo.action.SpringAction">         <!--(1)依赖注入,配置当前类中相应的属性-->         <property name="springDao" ref="springDao"></property>     </bean> <bean name="springDao" class="com.bless.springdemo.dao.impl.SpringDaoImpl"></bean> 构造器注入 这种方式的注入是指带有参数的构造函数注入,看下面的例子,我创建了两个成员变量SpringDao和User,但是并未设置对象的set方法,所以就不能支持第一种注入方式,这里的注入方式是在SpringAction的构造函数中注入,也就是说在创建SpringAction对象时要将SpringDao和User两个参数值传进来: Java代码   public class SpringAction {     //注入对象springDao     private SpringDao springDao;     private User user;     public SpringAction(SpringDao springDao,User user){         this.springDao = springDao;         this.user = user;         System.out.println("构造方法调用springDao和user");     }         public void save(){         user.setName("卡卡");         springDao.save(user);     } } 在XML文件中同样不用<property>的形式,而是使用<constructor-arg>标签,ref属性同样指向其它<bean>标签的name属性: Xml代码   <!--配置bean,配置后该类由spring管理-->     <bean name="springAction" class="com.bless.springdemo.action.SpringAction">         <!--(2)创建构造器注入,如果主类有带参的构造方法则需添加此配置-->         <constructor-arg ref="springDao"></constructor-arg>         <constructor-arg ref="user"></constructor-arg>     </bean>         <bean name="springDao" class="com.bless.springdemo.dao.impl.SpringDaoImpl"></bean>          <bean name="user" class="com.bless.springdemo.vo.User"></bean>   解决构造方法参数的不确定性,你可能会遇到构造方法传入的两参数都是同类型的,为了分清哪个该赋对应值,则需要进行一些小处理: 下面是设置index,就是参数位置: Xml代码   <bean name="springAction" class="com.bless.springdemo.action.SpringAction">         <constructor-arg index="0" ref="springDao"></constructor-arg>         <constructor-arg index="1" ref="user"></constructor-arg>     </bean>   另一种是设置参数类型: Xml代码   <constructor-arg type="java.lang.String" ref=""/> 静态工厂的方法注入 静态工厂顾名思义,就是通过调用静态工厂的方法来获取自己需要的对象,为了让spring管理所有对象,我们不能直接通过"工程类.静态方法()"来获取对象,而是依然通过spring注入的形式获取: Java代码   package com.bless.springdemo.factory; import com.bless.springdemo.dao.FactoryDao; import com.bless.springdemo.dao.impl.FactoryDaoImpl; import com.bless.springdemo.dao.impl.StaticFacotryDaoImpl; public class DaoFactory {     //静态工厂     public static final FactoryDao getStaticFactoryDaoImpl(){         return new StaticFacotryDaoImpl();     } } 同样看关键类,这里我需要注入一个FactoryDao对象,这里看起来跟第一种注入一模一样,但是看随后的xml会发现有很大差别: Java代码   […]

龙生   05 Aug 2017
View Details

浅谈依赖注入

最近几天在看一本名为Dependency Injection in .NET 的书,主要讲了什么是依赖注入,使用依赖注入的优点,以及.NET平台上依赖注入的各种框架和用法。在这本书的开头,讲述了软件工程中的一个重要的理念就是关注分离(Separation of concern, SoC)。依赖注入不是目的,它是一系列工具和手段,最终的目的是帮助我们开发出松散耦合(loose coupled)、可维护、可测试的代码和程序。这条原则的做法是大家熟知的面向接口,或者说是面向抽象编程。 关于什么是依赖注入,在Stack Overflow上面有一个问题,如何向一个5岁的小孩解释依赖注入,其中得分最高的一个答案是: “When you go and get things out of the refrigerator for yourself, you can cause problems. You might leave the door open, you might get something Mommy or Daddy doesn’t want you to have. You might even be looking for something we don’t even have or which has expired. What you should be doing is stating a need, “I need something to drink with lunch,” and then we will make sure you have something when you sit […]

龙生   05 Aug 2017
View Details

从 Win10 文件资源管理器左侧栏中删除 OneDrive

认识 Windows 10 文件资源管理器中的 OneDrive。 单击启动任务栏上的“文件资源管理器”,它打开后可以在左侧导航栏里看到 OneDrive。 对于使用 OneDrive 云服务的人来说,这个链接按钮当然很方便; 但是对于不使用的人来说,它就有点碍事,使得资源列表整个被下移了。 我们开始着手删除它。 按 Ctrl + q 组合键,调用小娜实施应用搜索:在搜索框中输入:regedit;小娜在上方显示出“最佳匹配”,我们直接按下回车。 这样就启动了注册表编辑器。 它可是老朋友了,上世纪的 Windows 性能调整,可离不开它了。 我们按下 Ctrl + f 组合键,弹出查找对话框,我们以下字符串中的花括号里面的内容粘贴进去,也就是下面粗斜体的部分: HKEY_CLASSES_ROOT\CLSID\{018D5C66-4533-4307-9B53-224DE2ED1FE6} 然后单击“查找下一个”按钮。 经过一段时间的搜索,注册表编辑器定位到我们要查找的位置。 再往右边看,有个 System.IsPinnedToNameSpaceTree 的 DWORD,它的默认值是 1。为了从 Windows 10 的文件资源管理器中让 OneDrive 消失,我们把它改为 0 。 立刻生效,我们再打开文件资源管理器,左侧导航栏中已经没有 OneDrive 的条目了。 可对比第 1 步骤中的图。 如果想把 OneDrive 的图标再恢复回来,那在第 6 步骤中,把那个 0 改为 1就可以了。 from:http://jingyan.baidu.com/article/154b4631739cd228cb8f415f.html?qq-pf-to=pcqq.c2c&_t_t_t=0.5240869508187846

龙生   04 Aug 2017
View Details

Windows系统大文件夹集合

C:\Windows\System32\DriverStore C:\Windows\WinSxS C:\Windows\Installer

龙生   03 Aug 2017
View Details

启用Win10中Administrator超管账户

cmd net user administrator /active:yes  

龙生   03 Aug 2017
View Details

在Eclipse中如何项目重新编译、清理缓存

在Java web项目中经常出现重命名一个Java文件,最后不能运行,原因是tomcat服务器有缓存。解决办法是进行clean。  在一个项目中,如果我们想要对全部类文件及配置文件进行重新编译,在Eclipse可以采取如下办法: 在Eclipse下,选中Project下的Clean一项,进入之后可以看到Clean all projects选后点“OK”就可以了。这时我们再打开Eclipse中用来保存编译文件的classes文件就可以看到刚才编译的。   from:http://blog.csdn.net/gao1440156051/article/details/53517197

龙生   02 Aug 2017
View Details

Eclipse中web项目部署至Tomcat步骤

Eclipse的web工程至Tomcat默认的部署目录是在工程空间下,本文旨在将部署目录改为Tomcat安装目录,并解决依赖包输出问题。 1.在Eclipse中添加Tomcat服务器。 2.将web工程发布至tomcat: 选择刚添加的Tomcat: 此时Eclipse将自动生成Servers工程: 3.在Servers视图,Remove删除刚刚发布的项目: 4.打开Tomcat服务器配置项: 5.修改以下两个配置项,Tomcat保持启动状态,否则Server Locations一栏变灰色,不可用: 6.配置lib输出。 项目右键: 点击下一步,选中需要随项目发布到tomcat的包,完成确认操作。 7.修改工程下的.classpath文件,将如下配置项提至最前面,否则发布项目时,先前发布到WEB-INF里面的文件将被覆盖: 8.重新发布项目即可。   from:http://blog.csdn.net/lucklq/article/details/7621807

龙生   02 Aug 2017
View Details

我的my.ini

 

龙生   02 Aug 2017
View Details

innodb_file_per_table

MySQL InnoDB引擎 默认会将所有的数据库InnoDB引擎的表数据存储在一个共享空间中:ibdata1,当增删数据库的时候,ibdata1文件不会自动收缩,单个数据库的备份也将成为问题。通常只能将数据使用mysqldump 导出,然后再导入解决这个问题。 在MySQL的配置文件[mysqld]部分,增加innodb_file_per_table参数,可以修改InnoDB为独立表空间模式,每个数据库的每个表都会生成一个数据空间。   注意: 如果启用了innodb_file_per_talbe参数,需要注意的是每张表的表空间内存放的只是数据、索引和插入缓冲Bitmap页,其他数据如:回滚信息、插入缓冲索引页、系统事物信息、二次写缓冲(Double write buffer)等还是放在原来的共享表空间内。同时说明了一个问题:即使启用了innodb_file_per_table参数共享表空间还是会不断的增加其大小的。 独立表空间优缺点: 优点: 1:每个表的数据、索引存放在自己单独的表空间中。 2:空间可以回收(drop/truncate table 方式操作表空间不能自动回收) 3:对于独立的表空间、碎片影响的性能要低于共享表空间 缺点: 单表增加比共享表空间方式更大 结论: 共享表空间在Insert操作上有一些优势,但在其它都没独立表空间表现好。 当启用独立表空间时,请合理调整一下 innodb_open_files 参数。 from:http://www.cnblogs.com/xiaoit/p/4096165.html

龙生   02 Aug 2017
View Details
1 234 235 236 432