实验一 Spring中Bean的使用
- 实验目的
1、了解Spring的概念和优点;
2、掌握Spring中IoC和DI的概念与原理;
3、掌握Bean的setter、constructor注入方法;
4、掌握Bean的XML和Annotation装配方法;
5、掌握Bean的singleton和prototype作用域的概念与区别。
- 实验内容
1、已知一个User类包含以下的属性和方法,属性:username(String),password(Integer),relation(List<String>,指明User对象间的相互关系,通过username指明);方法:一个无参构造方法,一个能对各个属性都进行初始化的构造方法,各个属性的setter和getter,一个toString方法(输出各个属性的值,对于relation属性,要指明当前User与哪些User相关)。现通过以下方法创建三个User对象(都需指明各个属性的值),并且他们之间都是相互相关的。使用XML配置方式编写程序实现上述功能,并分别进行测试。
(1)使用实例化工厂方式;
a.实验结果
b实验代码
package shiyan1.shiyan1_1;
public class Main {
public static void main(String[] args) {
UserFactory factory = new UserFactory();
User user1 = factory.createUser1();
User user2 = factory.createUser2();
User user3 = factory.createUser3();
System.out.println(user1);
System.out.println(user2);
System.out.println(user3);
}
}
package shiyan1.shiyan1_1;
import java.util.List;
public class User {
private String username;
private int password;
private List<String> relation;
public User() {
}
public User(String username, int password, List<String> relation) {
this.username = username;
this.password = password;
this.relation = relation;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public int getPassword() {
return password;
}
public void setPassword(int password) {
this.password = password;
}
public List<String> getRelation() {
return relation;
}
public void setRelation(List<String> relation) {
this.relation = relation;
}
@Override
public String toString() {
return "User{" +
"username='" + username + '\'' +
", password=" + password +
", relation=" + relation +
'}';
}
}
package shiyan1.shiyan1_1;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
//实例化工厂
public class UserFactory {
public User createUser1() {
List<String> relation1 = new ArrayList<String>(Arrays.asList("user2", "user3"));
User user1 = new User("user1", 123456, relation1);
return user1;
}
public User createUser2() {
List<String> relation2 = new ArrayList<String>(Arrays.asList("user1", "user3"));
User user2 = new User("user2", 123456, relation2);
return user2;
}
public User createUser3() {
List<String> relation3 = new ArrayList<String>(Arrays.asList("user1", "user2"));
User user3 = new User("user3", 123456, relation3);
return user3;
}
}
(2)使用静态工厂方式;
a.实验结果
b实验代码
package shiyan1.shiyan1_2;
import shiyan1.shiyan1_1.User;
public class Main {
public static void main(String[] args) {
User user1 = StaticUserFactory.createUser1();
User user2 = StaticUserFactory.createUser2();
User user3 = StaticUserFactory.createUser3();
System.out.println(user1);
System.out.println(user2);
System.out.println(user3);
}
}
package shiyan1.shiyan1_2;
import shiyan1.shiyan1_1.User;
import java.util.Arrays;
//静态工厂
public class StaticUserFactory {
public static User createUser1() {
User user1 = new User();
user1.setUsername("user1");
user1.setPassword(123456);
user1.setRelation(Arrays.asList("user2", "user3"));
return user1;
}
public static User createUser2() {
User user2 = new User();
user2.setUsername("user2");
user2.setPassword(123456);
user2.setRelation(Arrays.asList("user1", "user3"));
return user2;
}
public static User createUser3() {
User user3 = new User();
user3.setUsername("user3");
user3.setPassword(123456);
user3.setRelation(Arrays.asList("user1", "user2"));
return user3;
}
}
(3)使用构造注入方式;
a.实验结果
b实验代码
<?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="user1" class="shiyan1.shiyan1_3.User">
<constructor-arg name="username" value="user1"/>
<constructor-arg name="password" value="123456"/>
<constructor-arg name="relation">
<list>
<value>user2</value>
<value>user3</value>
</list>
</constructor-arg>
</bean>
<bean id="user2" class="shiyan1.shiyan1_3.User">
<constructor-arg name="username" value="user2"/>
<constructor-arg name="password" value="123456"/>
<constructor-arg name="relation">
<list>
<value>user1</value>
<value>user3</value>
</list>
</constructor-arg>
</bean>
<bean id="user3" class="shiyan1.shiyan1_3.User">
<constructor-arg name="username" value="user3"/>
<constructor-arg name="password" value="123456"/>
<constructor-arg name="relation">
<list>
<value>user1</value>
<value>user2</value>
</list>
</constructor-arg>
</bean>
</beans>
package shiyan1.shiyan1_3;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
//构造注入
public class ConstructorInjection {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("constructor-injection.xml");
User user1 = (User) context.getBean("user1");
User user2 = (User) context.getBean("user2");
User user3 = (User) context.getBean("user3");
System.out.println(user1);
System.out.println(user2);
System.out.println(user3);
}
}
package shiyan1.shiyan1_3;
import java.util.List;
public class User {
private String username;
private int password;
private List<String> relation;
public User() {
}
public User(String username, int password, List<String> relation) {
this.username = username;
this.password = password;
this.relation = relation;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public int getPassword() {
return password;
}
public void setPassword(int password) {
this.password = password;
}
public List<String> getRelation() {
return relation;
}
public void setRelation(List<String> relation) {
this.relation = relation;
}
@Override
public String toString() {
return "User{" +
"username='" + username + '\'' +
", password=" + password +
", relation=" + relation +
'}';
}
}
(4)使用设值注入方式。
a.实验结果
b实验代码
package shiyan1.shiyan1_4;
import java.util.List;
public class User {
private String username;
private Integer password;
private List<String> relation;
public User() {}
public User(String username, Integer password, List<String> relation) {
this.username = username;
this.password = password;
this.relation = relation;
}
public void setUsername(String username) {
this.username = username;
}
public String getUsername() {
return username;
}
public void setPassword(Integer password) {
this.password = password;
}
public Integer getPassword() {
return password;
}
public void setRelation(List<String> relation) {
this.relation = relation;
}
public List<String> getRelation() {
return relation;
}
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("username: ").append(username).append("\n");
sb.append("password: ").append(password).append("\n");
sb.append("relation: ");
for (String username : relation) {
sb.append(username).append(", ");
}
return sb.toString();
}
}
package shiyan1.shiyan1_4;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.Arrays;
@Configuration
public class UserConfig {
@Bean
public User user1() {
User user = new User();
user.setUsername("Alice");
user.setPassword(123);
user.setRelation(Arrays.asList("Bob", "Carol"));
return user;
}
@Bean
public User user2() {
User user = new User();
user.setUsername("Bob");
user.setPassword(234);
user.setRelation(Arrays.asList("Alice"));
return user;
}
@Bean
public User user3() {
User user = new User();
user.setUsername("Carol");
user.setPassword(345);
user.setRelation(Arrays.asList("Alice"));
return user;
}
}
package shiyan1.shiyan1_4;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.Arrays;
@Configuration
public class UserConfig {
@Bean
public User user1() {
User user = new User();
user.setUsername("Alice");
user.setPassword(123);
user.setRelation(Arrays.asList("Bob", "Carol"));
return user;
}
@Bean
public User user2() {
User user = new User();
user.setUsername("Bob");
user.setPassword(234);
user.setRelation(Arrays.asList("Alice"));
return user;
}
@Bean
public User user3() {
User user = new User();
user.setUsername("Carol");
user.setPassword(345);
user.setRelation(Arrays.asList("Alice"));
return user;
}
}
2、使用User类编写程序验证和说明Bean的singleton和prototype作用域的区别。
a.实验结果:
首先定义了一个User类,其中包含了一个静态变量count和一个实例变量id。每次创建User对象时,count会加1,id会被赋值为count的值。在ApplicationContextTest中,分别测试了singleton和prototype作用域的Bean。对于singleton作用域的Bean,我们创建了两个User对象,并且通过getId()方法获取它们的id值。由于它们属于同一个实例,因此它们的id值应该相等。对于prototype作用域的Bean,同样创建了两个User对象,但是它们都是新的实例,因此它们的id值应该不相等。最后,在applicationContext.xml中,定义了两个Bean,一个是singleton作用域的Bean,另一个是prototype作用域的Bean。在定义Bean时,我们可以通过scope属性指定Bean的作用域,其默认值为singleton。
b.实验代码
package shiyan1_2;
public class User {
private static int count = 0;
private int id;
public User() {
count++;
id = count;
}
public int getId() {
return 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">
<!-- singleton -->
<bean id="user" class="shiyan1_2.User" scope="singleton"/>
<!-- prototype -->
<bean id="userPrototype" class="shiyan1_2.User" scope="prototype"/>
</beans>
package shiyan1_2;
import org.junit.jupiter.api.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import static org.junit.jupiter.api.Assertions.*;
public class ApplicationContextTest {
@Test
public void testSingletonAndTestPrototype() {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext1.xml");
User user1 = (User) context.getBean("user");
User user2 = (User) context.getBean("user");
assertEquals(user1.getId(), user2.getId());
System.out.println("单例---id相等");
User user3 = (User) context.getBean("userPrototype");
User user4 = (User) context.getBean("userPrototype");
assertNotEquals(user3.getId(), user4.getId());
System.out.println("原型---id不相等");
}
}
3、已知一个Sping项目包含以下的类:
StudentDao:
1. package com.itheima.g_annotation.b_web;
2.
3. public interface StudentDao {
4.
5. void save();
6.
7. }
StudentDaoImpl:
1. public class StudentDaoImpl implements StudentDao {
2.
3. public void save() {
4. System.out.println("dao");
5. }
6.
7. }
StudentService:
1. public interface StudentService {
2.
3. void addStudent();
4.
5. }
StudentServiceImpl:
1. public class StudentServiceImpl implements StudentService {
2.
3. private StudentDao studentDao;
4. public void setStudentDao(StudentDao studentDao) {
5. this.studentDao = studentDao;
6. }
7. public void addStudent() {
8. studentDao.save();
9. }
10. }
StudentAction:
1. public class StudentAction {
2. private StudentService studentService;
3.
4. public void execute() {
5. studentService.addStudent();
6. }
7.
8. }
使用注解方式实现上述Bean的装配,并进行测试。
a.实验结果
b.实验代码
c. package shiyan1_3;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
@Controller
public class StudentAction {
@Autowired
private StudentService studentService;
public void execute() {
studentService.addStudent();
}
}
d. package shiyan1_3;
public interface StudentDao {
void save();
}
e. package shiyan1_3;
import org.springframework.stereotype.Repository;
@Repository
public class StudentDaoImpl implements StudentDao {
public void save() {
System.out.println("dao");
}
}
f. package shiyan1_3;
import org.springframework.stereotype.Service;
public interface StudentService {
void addStudent();
}
g. package shiyan1_3;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class StudentServiceImpl implements StudentService {
@Autowired
private StudentDao studentDao;
public void addStudent() {
studentDao.save();
}
}
h. package shiyan1_3;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import shiyan1.shiyan1_4.User;
import static org.junit.jupiter.api.Assertions.assertNotNull;
@ExtendWith(SpringExtension.class)
@ContextConfiguration("classpath:applicationContext3.xml")
public class AnnotationTest {
@Autowired
private StudentAction studentAction;
@Test
public void testExecute() {
studentAction.execute();
}
}
i. <?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="shiyan1_3"/>
</beans>