Spring创建对象的两种方法和获取对象(IDEA2018 图解)

创建对象的两种方法

1. 创建Maven工程

在这里插入图片描述
创建Maven工程选择archetype创建,选择图中的组件,next
在这里插入图片描述
输入包名和文件名,next
在这里插入图片描述
finish创建完成
在这里插入图片描述

2. 向pom.xml中加入Spring依赖

加入依赖,修改jdk版本

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.tmp</groupId>
  <artifactId>ch1</artifactId>
  <version>1.0-SNAPSHOT</version>
  
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>

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

3. 创建自定义的类

Student类

package com.tmp;

public class Student {
    private String name;
    private Integer age;
    private School school;

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", school=" + school +
                '}';
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public void setSchool(School school) {
        this.school = school;
    }
}

School测试类

package com.tmp;

public class School {
    private String name;

    public School() {
    }


    public String toString() {
        return "School{" +
                "name='" + name + '\'' +
                '}';
    }

    public String getName() {
        return name;
    }



    public void setName(String name) {
        this.name = name;
    }
}


4. 使用Spring框架创建bean

创建spring配置文件

  1. 创建与main文件同级的源文件夹
    在这里插入图片描述
    在resources文件夹中创建spring的配置文件
    在这里插入图片描述
    创建好的spring配置文件内容如下
<?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>

创建对象

方法一:使用配置文件创建对象

java中的对象成为bean

< bean >:用于定义一个实例对象。一个实例对应一个 bean 元素。
id:该属性是 Bean 实例的唯一标识,程序通过 id 属性访问 Bean,Bean 与 Bean 间的依赖关系也是通过 id 属性关联的。
class:指定该 Bean 所属的类,注意这里只能是类,不能是接口。

一个bean标签一个对象
创建School的一个对象


    <bean id="mySchool" class="com.tmp.School">
        
    </bean>

创建Student对象

    <bean id="myStudent" class="com.tmp.Student" autowire="byName">
    
    </bean>
对象初始化
  • setter方法初始化
    这种方法是调用类的setter方法
    • 基本数据类型
        <bean id="mySchool" class="com.tmp.School">
            <property name="name" value="hnu"/>
        </bean>
    
    • 引用类型初始化
      • 通过ref

            <bean id="myStudent" class="com.tmp.Student" autowire="byName">
                <property name="name" value="zhangsan"/>
                <property name="age" value="18"/>
                <property name="school" ref="mySchool"/>
            </bean>
        
      • 通过byName自动注入
        这种方法必须有一个bean的id和属性的名字是一样的。

        <?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="school" class="com.tmp.School">
                <property name="name" value="hnu"/>
            </bean>
        
            <bean id="myStudent" class="com.tmp.Student" autowire="byName">
                <property name="name" value="zhangsan"/>
                <property name="age" value="18"/>
            </bean>
        
        </beans>
        

        这里Student类中引用类型属性名字为school,所以School的对象id名字为school

      • 通过byType自动注入
        只能有一个bean的类型和属性类型一样,不然就会报错。

完整的配置文件

<?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="mySchool" class="com.tmp.School">
        <property name="name" value="hnu"/>
    </bean>
    <bean id="myStudent" class="com.tmp.Student" autowire="byType">
        <property name="name" value="zhangsan"/>
        <property name="age" value="18"/>
    </bean>

</beans>
  • 构造方法初始化
    这种方法调用参数构造方法创建对象
    在这里插入图片描述

    标签中用于指定参数的属性有:
    ➢ name:指定参数名称。
    ➢ index:指明该参数对应着构造器的第几个参数,从 0 开始。不过,该属性不要也行,
    但要注意,若参数类型相同,或之间有包含关系,则需要保证赋值顺序要与构造器中的参数
    顺序一致。

方法二: 使用注解(更常用)
创建对象

学习的注解:

  • @Component(value = "id")
    值为对象id,可以省略为@Component("id")
    注意:直接写成@Component id默认为类的名字(首字母小写)
    注解写在类的上面

    package com.study.ba01;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.stereotype.Component;
    
    @Component(value = "myStudent")
    public class Student {
        @Value("zhang")
        private String name;
        @Value("18")
        private Integer age;
        @Autowired
        private School school;
    
        @Override
        public String toString() {
            return "Student{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    ", school=" + school +
                    '}';
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public Integer getAge() {
            return age;
        }
    
        public void setAge(Integer age) {
            this.age = age;
        }
    }
    
    

其他创建对象的注解

  • @Respotory (用在持久层类的上面) 放在dao的实现类上面,表示创建dao对象,dao对象是能访问数据库的
  • @Service (用在业务层类的上面) 放在service的实现类上面,创建service对象,service对象是做业务处理,可以有事务功能的
  • @Controller (用在控制器的上面) 放在控制器(处理器)类的上面,创建控制器对象的,控制器对象能接受用户提交的参数,显示请求的处理结果

这三个注解使用方法和Component一样,但是除了创建对象的功能还能进行分层

对象初始化

使用注解进行初始化,不需要类中存在setter方法

  • 基本数据类型

    • @Value

       	@Value("zhang")
          private String name;
          @Value("18")
          private Integer age;
      
  • 引用数据类型

    • @Autowired
      • byType自动注入

         @Autowired
         private School school;
        
      • byName自动注入

        @Autowired
        @Qualifier("mySchool")
        private School school;
        
    • @Resource
      JDK的注解
      • 没有参数是byType注入

        @Resource
        private School school;
        
      • byName注入

        @Resource(name = "mySchool")
        private School school;
        
在配置文件中加入扫描器

扫描器会扫描指定包下的所有子包中的对象

<?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 https://www.springframework.org/schema/context/spring-context.xsd">
        <context:component-scan base-package="com.tmp"/>
</beans>

指定多个扫描器
1)使用多个 context:component-scan 指定不同的包路径
在这里插入图片描述
2)指定 base-package 的值使用分隔符
分隔符可以使用逗号(,)分号(;)还可以使用空格,不建议使用空格。
逗号分隔:
在这里插入图片描述

分号分隔:
在这里插入图片描述

3)base-package 是指定到父包名
base-package 的值表是基本包,容器启动会扫描包及其子包中的注解,当然也会扫描到
子包下级的子包。所以 base-package 可以指定一个父包就可以。
在这里插入图片描述
或者最顶级的父包
在这里插入图片描述
但不建议使用顶级的父包,扫描的路径比较多,导致容器启动时间变慢。指定到目标包和合
适的。也就是注解所在包全路径。例如注解的类在 com.bjpowernode.beans 包中
在这里插入图片描述

5. 获取使用对象

  • 构建工程生成target目录
    在这里插入图片描述
    生成如下:
    在这里插入图片描述

  • 获取对象的步骤

    • 获取ApplicationContext对象。
      ClassPathXmlApplicationContext这个类是ApplicationContext的子类,参数是文件的路径。从target/classes目录下开始获取。
    • 调用ApplicationContext对象的getBean(id)方法
      参数就是对象的id,会返回对应id的对象。
  • 在test的包目录下创建测试类Mytest获取使用对象

package com.tmp;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MyTest {
    @Test
    public void testPeizhi(){
        String peizhiPath = "peizhi.xml";
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext(peizhiPath);
        Student student = (Student) applicationContext.getBean("myStudent");
        System.out.println(student);
    }
}

测试方法创建规则

创建测试方法
1)public 方法
2)没有返回值 void
3)方法名称自定义,建议名称是test + 你要测试方法名称
4)方法没有参数
5)方法的上面加入 @Test ,这样的方法是可以单独执行的。 不用使用main方法。

运行测试方法testPeizhi得到结果:

Student{name='zhangsan', age=18, school=School{name='hnu'}}
posted @ 2022-04-26 21:10  墨镜一戴谁也不爱  阅读(381)  评论(0)    收藏  举报