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配置文件
- 创建与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")
注意:直接写成@Componentid默认为类的名字(首字母小写)
注解写在类的上面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'}}
本文来自博客园,作者:墨镜一戴谁也不爱,转载请注明原文链接:https://www.cnblogs.com/hnuzmh/p/16196505.html

浙公网安备 33010602011771号