实验一 Spring中Bean的使用

实验一 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.   

StudentDaoImpl:  

  1. public class StudentDaoImpl implements StudentDao {  
  2.    
  3.     public void save() {  
  4.         System.out.println("dao");  
  5.     }  
  6.   

StudentService:

  1. public interface StudentService {  
  2.   
  3.     void addStudent();  
  4.   

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>

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值