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#方式命名了)

图片描述

图片描述

 public class A{
    public void Hello(){
         system.out.println("Hello world");
    }
 }
 
 
 public class FactoryA{
 
        public static A GetA(){
               A a=new A();
               return a;
       }
 }
 
 public class  FactoryB{
        public A GetA(){
              A a=new A();
               return a;
        }
 }

View Code
如上代码我们如何获取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可以指定给注解中.