java Spring 之IOC依赖注入
内容简介
- spring ioc和xml配置文件实现注入
- spring 注解模式实现注入
Java使用框架都需要导入jar包,xml配置需要导入4个核心包,java核心包基本都不提供日记功能,需要导入2个额外日记包,我的spring是4.x版本.导入包如下(下载地址不在这里发了,百度下载)
- spring-beans-4.3.8.RELEASE.jar
- spring-context-4.3.8.RELEASE.jar
- spring-core-4.3.8.RELEASE.jar
- spring-expression-4.3.8.RELEASE.jar
- commons-logging-1.2.jar
- log4j-1.2.17.jar
bean包是标签包,core是核心包,expression应该是验证表达式包,context我估计是根据提供的路径反射生成对象的包,(我学历不够,才小学毕业自学的java,自学理解的spring ioc注入,非程序员).
spring 包导入后,需要一个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.xsd"> <bean id="user" class="cn.panda.model.user">
<constructor-arg ref="book"/>
<constructor-arg type="int" value="21"/>
<bean>
<bean id="book" class="cn.panda.model.book">
<property name="bookname" value="西游记"/>
</bean> </beans>
在一一介绍 bean标签的关键词
id是一个唯一名称.命名要规范,前面不能已特殊符号开头,中间不能有空格这些特殊符号,我一般是用骆驼(UserName)命名法,不知道帕斯卡命名(user_name)行不行.
class 是需要生成的对象的全路径(cn.panda.userDao)
scope 是生成对象保存在哪里对象.总共7个属性,基本用的最多是2个,singleton 单列模式(默认),每次获取对象都是同一个对象内存地址是同一个. prototype是多列模式,每次生成都是新的对象. session. request ,globalssion,application 这几个是关于HTTP有关的对象(不是很重要,基本很少用或者不用)最后只要知道就可以了websocket.
name 属性好像是为了兼容strut1.x版本和老版本.还有可以使用一些特殊符号的名称,总体和ID关键词差不多的功能
constructor-arg是对象构造函数注入参数.是bean子节点(可以多个参数节点),里面有3个比较常用的属性,ref对应是需要注入的对象id, type 是注入变量名称如Int,java.lang.String这些, value指定的值.
property 是bean对象子节点的,里面有个name属性对应对象的属性名称,ref 需要赋值的bean 的ID值,value是指定的值...
下面是复杂的属性注入list,map,properties,set (复制官方文档了)
<bean id="moreComplexObject" class="example.ComplexObject"> <!-- results in a setAdminEmails(java.util.Properties) call --> <property name="adminEmails"> <props> <prop key="administrator">administrator@example.org</prop> <prop key="support">support@example.org</prop> <prop key="development">development@example.org</prop> </props> </property> <!-- results in a setSomeList(java.util.List) call --> <property name="someList"> <list> <value>a list element followed by a reference</value> <ref bean="myDataSource" /> </list> </property> <!-- results in a setSomeMap(java.util.Map) call --> <property name="someMap"> <map> <entry key="an entry" value="just some string"/> <entry key ="a ref" value-ref="myDataSource"/> </map> </property> <!-- results in a setSomeSet(java.util.Set) call --> <property name="someSet"> <set> <value>just some string</value> <ref bean="myDataSource" /> </set> </property> </bean>
这里介绍如何静态方法和工厂方法生成对象.....先写一段代码(代码命名对于java程序员来说不是很规范,以前自学c#,所以有些命名用c#方式命名了)
1 public class A{ 2 public void Hello(){ 3 system.out.println("Hello world"); 4 } 5 } 6 7 8 public class FactoryA{ 9 10 public static A GetA(){ 11 A a=new A(); 12 return a; 13 } 14 } 15 16 public class FactoryB{ 17 public A GetA(){ 18 A a=new A(); 19 return a; 20 } 21 }
如上代码我们如何获取A的对象.bean也提供了几个关键词,我还是在代码里写注解和解释
<!--静态方法获取的A的注入生成的对象...class是工厂类的全路径 ,factory-method是方法名称--> <bean id="A" class="factoryA" factory-method="GetA"/> <!--IOC注入生成A的对象我们先配置A和需要生成的A的对象factoryB的配置--> <!--factory-bean对应实列工厂的bean名称--> <bean id="A" factory-bean="factoryB" factory-method="GetA"/> <bean id="factoryB" class="factoryB"/>
最后一个多xml文件引入,因为一个项目不同人开发不同的模块,可以引入多个xml配置文件
<beans> <import resource="xml文件的路径"/> <bean id=".." class="..."/> </beans>
spring IOC依赖注入的xml文件比较常用都写完了,下面是注解模式.注解模式需要一个引入一个核心包 spring-aop-4.3.8.RELEASE.jar
在配置文件重新编辑约束包,我只写一些比较常用的注解模式比较全建议看官方文档.都是英文版
<?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.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <context:component-scan base-package="cn.panda.*"/> </beans>
可以看到此约束比xml约束多了一个xmlns:context约束和<context:component-scan base-package="cn.panda.*"/> 这个就是表示开启注解模式...
base-package扫描那个包的注解,多个包可以用,分开如(cn.panda.model,cn.panda.dao)也可以用cn.panda.*表示扫描是cn.panda的包,后面所有的意思.不管你后面是啥都会扫描.
注解4个功能一样注解的. @Component(实体层),@Service(逻辑处理层),@Controller(web层),@Repository(Dao层).不知道以后spring官方会不会给他们不同的功能,现在功能都差不多.
下面用一段代码+加注解可以更好讲解比较常用的注解模式.
pakeage cn.panda.model; /*实体层代码,映射层*/ @Component(value="user") /*scope("singleton") 这里可以加singelton或者prototye,反正scope的7个不写默认singelton*/ public class user{ } pakeage cn.panda.dao; /*数据访问层*/ @Repository(value="userdao") public class userdao(){ public int add(user user){ /*代码处理逻辑代码*/ } } pakeage cn.panda.service; @Service(value="userservice") public class userservice{ private cn.panda.dao.userdao userdao; /*@Autowired就是自动注入跟userdao字段一样名称对象,如果不存在userdao就会报错*/ /*@Resource(name="userdao") 就是指定注入ID的对象.*/ public void cn.panda.dao.userdao setUserdao(cn.panda.dao.userdao userdao){ this.userdao=userdao; } public int add(cn.panda.user user){ return this.userdao.add(user); } } /*这里介绍@controller 这个注解,一般这个注解是用于web层.词义是控制器意思*/ @controller /*ActionSuport是stucts2的一个类,我现在木有学到这里整合对象这些,以后会介绍stucts2*/ public class Index extends ActionSuport{ }
注解还有很多,还有configuration配置.还有引入过滤一些注解.这些暂时不写了,我感觉作用不怎么大,所以木有怎么自学过.
混合模式就是xml加注解模式注入的注意事项,我也不知道正不正确验证,我也是自学的.注解中指定ID不知道跟xml配置ID不能重复.第二,xml配置ID可以指定给注解中.