欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

java Spring 之IOC依赖注入

程序员文章站 2023-04-08 11:14:29
内容简介 spring ioc和xml配置文件实现注入 spring 注解模式实现注入 Java使用框架都需要导入jar包,xml配置需要导入4个核心包,java核心包基本都不提供日记功能,需要导入2个额外日记包,我的spring是4.x版本.导入包如下(下载地址不在这里发了,百度下载) bean包 ......

内容简介

  • spring ioc和xml配置文件实现注入
  • spring 注解模式实现注入

Java使用框架都需要导入jar包,xml配置需要导入4个核心包,java核心包基本都不提供日记功能,需要导入2个额外日记包,我的spring是4.x版本.导入包如下(下载地址不在这里发了,百度下载)

  1. spring-beans-4.3.8.RELEASE.jar
  2. spring-context-4.3.8.RELEASE.jar
  3. spring-core-4.3.8.RELEASE.jar
  4. spring-expression-4.3.8.RELEASE.jar
  5. commons-logging-1.2.jar
  6. 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#方式命名了)

java Spring 之IOC依赖注入
 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 }
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可以指定给注解中.