1、创建maven项目
2、导入Spring需要的包,配置文件
3、通过工厂模式反射创建对象
4、Spring创建对象
一、创建maven项目
1、文件目录
二、导入需要的包
1、 在poom.xml
<?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>org.example</groupId>
<artifactId>Spring_Day03</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<name>Spring_Day03 Maven Webapp</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<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>
<!-- @Test-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>provided</scope>
</dependency>
<!-- spring的核心依赖包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>5.2.11.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.2.11.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.11.RELEASE</version>
</dependency>
<!--spring的单元测试包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.2.11.RELEASE</version>
</dependency>
</dependencies>
<build>
<finalName>Spring_Day03</finalName>
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
<plugins>
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.1.0</version>
</plugin>
<!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
</plugin>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.2</version>
</plugin>
<plugin>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
</plugin>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
2、创建 用户的实体类
com.yang.entity => User.class
package com.yang.entity;
public class User {
private String UserName,Pass,User;
private Integer age,id;
public User(){}
public User(String userName, String pass, String user, Integer age, Integer id) {
UserName = userName;
Pass = pass;
User = user;
this.age = age;
this.id = id;
}
public String getUserName() {
return UserName;
}
public void setUserName(String userName) {
UserName = userName;
}
public String getPass() {
return Pass;
}
public void setPass(String pass) {
Pass = pass;
}
public String getUser() {
return User;
}
public void setUser(String user) {
User = user;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
@Override
public String toString() {
return "User{" +
"UserName='" + UserName + '\'' +
", Pass='" + Pass + '\'' +
", User='" + User + '\'' +
", age=" + age +
", id=" + id +
'}';
}
}
三、通过工厂模式反射创建对象
1、创建工厂模式的配置文件(用配置文件是减少代码的耦合)
resources => User.properties
name=com.yang.entity.User
这样读取到配置文件,可以通过name找到User的全限定类名
2、新建类Bean.class
com.yang.Ulitle => Bean.class
package com.yang.Ultile;
import java.io.InputStream;
import java.util.Properties;
public class Bean {
private static Properties properties;
static {
try {
InputStream ins = Bean.class.getClassLoader().
getResourceAsStream("User.properties");
properties = new Properties();
properties.load(ins);
}catch (Exception e){
throw new NullPointerException("未找到User.properties");
}
}
// 调用该方法就要传入配置文件里面键值对的键从而找到对应的全限定类名
public static Object getBean(String user){
String name = properties.getProperty(user);
Object bean= null;
try {
bean = Class.forName(name).newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return bean;
}
}
2、测试工厂模式
package com.yang.test;
import com.yang.Ultile.Bean;
import com.yang.entity.User;
public class Test {
@org.junit.Test
public void Demo01() {
System.out.println("this is Demo01");
User user = null;
user = (User) Bean.getBean("name");
user.setUserName("ytg");
user.setId(1);
user.setUser("user");
user.setPass("123456");
user.setAge(18);
System.out.println(user);
}
}
注意:
3、测试结果
四、通过Spring创建对象
1、创建Spring的配置文件
resource => bean.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="UserService" class="com.yang.entity.User">
</bean>
</beans>
2、测试
在刚刚创建的Test.class补全Spring的测试
Test.class的全部代码
package com.yang.test;
import com.yang.Ultile.Bean;
import com.yang.entity.User;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {
@org.junit.Test
public void Demo01() {
System.out.println("this is Demo01");
User user = null;
user = (User) Bean.getBean("name");
user.setUserName("ytg");
user.setId(1);
user.setUser("user");
user.setPass("123456");
user.setAge(18);
System.out.println(user);
}
/*
* 通过Spring容器获取id对象
*
*/
@org.junit.Test
public void Demo02(){
System.out.println("this is Demo02");
// 获取xml文件
// ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
ApplicationContext ac =
new ClassPathXmlApplicationContext("bean.xml");
// 通过bean的id找到对应的全限定类名
User user = (User)ac.getBean("UserService");
user.setUserName("ytg");
user.setUser("ytg");
user.setAge(1);
user.setPass("123");
user.setId(1);
System.out.println(user);
}
}
3、点击Demo02方法测试Spring
测试结果如下:
五、工厂模式反射创建对象对比Spring创建对象
1、两者都是方便解耦(减少依赖User类没有User类在编译的时候也不会报错)
2、工厂模式是我们自己实现反射创建User对象
3、Spring是Spring给我们创建对象,也就是把创建对象的权限交给Spring,这就是权限反转(也就是ioc)