美文网首页
spring-1-IoC

spring-1-IoC

作者: blank_white | 来源:发表于2020-06-22 19:28 被阅读0次

    一、准备工作

    环境

    IntelliJ Idea
    Maven

    pom.xml 中添加依赖

      <dependencies>
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-context</artifactId>
          <version>4.3.16.RELEASE</version>
        </dependency>
      </dependencies>
    

    二、IoC

    Inversion of Control:控制反转

    • 一般编程中对象的获取:
    接口名  A = new 实现接口的类();
    
    • Ioc 的思路就是吧 new 的对象抽离
      在一个 xml 文件中做配置:
    "server" 是需要  com.Server 类对象
    "server2" 是需要  com.Server2 类对象
    "server3" 是需要 com.Server3 类对象
    

    在代码中需要使用对象的时候

    接口名 A = Spring对象.获取名字叫xx的对象("server");
    

    对象的创建委托给 Spring 框架,从而实现对对象的一些特殊处理的统一控制,更改对象的时候也只需改配置文件,不需要改代码

    三、简单配置使用

    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">
    </beans>
    

    配置创建对象,默认是单例模式

    <bean id="server" class="com.spyouth.service.SomeServerImpl" ></bean>
    单例模式,只创建一个
    <bean id="server" class="com.spyouth.service.SomeServerImpl" scope="singleton"></bean>
    原型模式,用一次创建一个
    <bean id="server" class="com.spyouth.service.SomeServerImpl" scope="prototype"></bean>
    

    使用方法

            String config="applicationContext.xml";
            //通过 类的存放路径
            ApplicationContext cxt=new ClassPathXmlApplicationContext(config);
            //通过 文件系统的路径
            //ApplicationContext cx2=new FileSystemXmlApplicationContext(config);
            SomeServer server= (SomeServer) cxt.getBean("server");
            server.doSome(1,"asd");
    

    四、为 bean 成员赋值

    Java 对象若不为成员变量赋值,数值型成员为 0,引用型成员为 null

    public class School {
        String name;
        String address;
        set、get方法......
    }
    public class Student {
        String name;
        School school;
        set、get方法......
    }
    
    • property 赋值
      要为类生成set、get方法,spring 通过调用 set 方法赋值
        <bean id="school" class="com.spyouth.study.School">
            <property name="name" value="清华"></property>
            <property name="address" value="五道口"></property>
        </bean>
    
        <bean id="student" class="com.spyouth.study.Student">
            <!--基本类型用 name/成员名、value/参数值 -->
            <property name="name" value="张三"></property>
            <!--引用类型用 name/成员名、ref/引用对象名,就是上面那个School对象 -->
            <property name="school" ref="school"></property>
        </bean>
    
    • 构造方法赋值
      需要对应的构造方法,spring 通过调用构造方法赋值
        public Student(String name, int age, School school) {
            this.name = name;
            this.age = age;
            this.school = school;
        }
        <bean id="student4" class="com.spyouth.study.Student">
            <constructor-arg name="name" value="赵丽"></constructor-arg>
            <constructor-arg name="age" value="18"></constructor-arg>
            <constructor-arg name="school" ref="school"></constructor-arg>
        </bean>
    
        <bean id="student5" class="com.spyouth.study.Student">
            <constructor-arg index="0" value="赵丽"></constructor-arg>
            <constructor-arg index="1" value="18"></constructor-arg>
            <constructor-arg index="2" ref="school"></constructor-arg>
        </bean>
    
    • 自动赋值
    <!--自动为成员变量赋值 byType 找能赋值给成员变量的对象-->
        <bean id="student2" class="com.spyouth.study.Student" autowire="byType"></bean>
        <!--自动为成员变量赋值 byName 找与成员变量名相同的对象-->
        <bean id="student3" class="com.spyouth.study.Student" autowire="byName"></bean>
    
    
    • 注解赋值
      使用注解需要告诉 spring 哪里有注解需要解析
    本包及子包都会去找
    <context:component-scan base-package="com.spyouth.study"></context:component-scan>
    
    @Component(value = "student8")
    public class Student {
        @Value("王五")
        public String name;
        @Value("28")
        public int age;
    
        //byName
        @Autowired
        @Qualifier(value = "school")
        public School school;
        //byType
        @Autowired
        public School school;
        //先 byName 没有找到就 byType
        @Resource
        public School school;
    
        //也可以注解在 set 方法上  
        @Value("18")
        public void setAge(int age) {
            this.age = age;
        }
    }
    
    • 注解 value 的省略简写
    @Component(value = "student8")
    @Component("student8")
    对于参数只有 value  二者等效
    

    五、import spring.xml

    所有 bean 都写在同一个 xml 文件中,过于混乱,而且不利于协作开发
    可以写一个总的 xml ,再将其他 xml 导入其中

        <import resource="classpath:spring-school.xml"></import>
        <import resource="classpath:spring-server.xml"></import>
    

    相关文章

      网友评论

          本文标题:spring-1-IoC

          本文链接:https://www.haomeiwen.com/subject/wkabihtx.html