【JavaEE案例】spring中的Bean的管理
【案例介绍】
(1)Bean的装配方式之基于注解的装配。
(2)Bean的生命周期。
【案例实现】
- 创建项目
- 引入相关依赖:在pom.xml文件中加载Spring依赖包。
<?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.itheima</groupId>
<artifactId>userManager</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.16</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>5.2.8.RELEASE</version>
</dependency>
<dependency>
<groupId>javax.annotation</groupId>
<artifactId>javax.annotation-api</artifactId>
<version>1.3.2</version>
</dependency>
</dependencies>
</project>
1.1 在src/main/resources目录下创建applicationContext.xml,在该文件中引入Context约束并启动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"
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 命名空间 ,在配置文件中开启相应的注解处理器 -->
<context:component-scan base-package="com.itheima" />
</beans>
1.2 定义实体类
在com.itheima包下新建entity包,在entity包下新建User实体类。
package com.itheima.entity;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
@Component("user")
@Scope("singleton")
public class User {
@Value("1")
private int id;
@Value("张三")
private String name;
@Value("123")
private String password;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String toString(){
return "id="+id+",name="+name+",password="+password;
}
}
1.3 编写DAO层
在com.itheima包下创建dao包,在dao包下创建接口UserDao作为数据访问层接口,并在UserDao接口中声明save()方法,用于查询User实体的对象信息。
package com.itheima.dao;
public interface UserDao {
public void save(); //用于查询user实体的对象信息
}
在com.itheima.dao包下创建UerDaoImpl作为UserDao接口的实现类,并在UerDaoImpl类中实现UserDao接口中的save()方法。
package com.itheima.dao;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Repository;
import com.itheima.entity.User;
//使用@Repository注解将UserDaoImpl类标识为Spring中的Bean
@Repository("userDao")
public class UserDaoImpl implements UserDao {
public void save(){
//代码加载applicationContext.xml配置文件
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
//User实例化
User user=(User) applicationContext.getBean("user");
//打印实例化后的user和提示信息
System.out.println(user);
System.out.println("执行UserDaoImpl.save()");
}
}
1.4 编写Service层
在com.itheima包下新建service包,在service包下创建UserService接口作为业务逻辑层接口,并在UserService接口中定义save()方法。
package com.itheima.service;
public interface UserService {
public void save();
}
在com.itheima.dao包下创建UserServiceImpl作为UserService接口的实现类,并在UserServiceImpl类中实现UserService接口中的save()方法。
package com.itheima.service;
import com.itheima.dao.UserDao;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
//使用@Service注解将UserServiceImpl类标识为Spring中的Bean
@Service("userService")
public class UserServiceImpl implements UserService {
//使用@Resource注解注入UserDao
@Resource(name="userDao")
private UserDao userDao;
public void save(){
this.userDao.save();
System.out.println("执行UserServiceImpl.save()");
}
}
1.5 编写Controller层
在com.itheima包下新建controller包,在service包下创建UserController类作为控制层。
package com.itheima.controller;
import org.springframework.stereotype.Controller;
import com.itheima.service.UserService;
import javax.annotation.Resource;
//使用Controller注解将UserController类标识为Spring中的Bean
@Controller
public class UserController {
//使用@Resource注解注入UserService
@Resource(name="userService")
private UserService userService;
public void save(){
this.userService.save();
System.out.println("执行UserController.save()");
}
}
1.6 编写测试类AnnotationTest.java
package com.itheima;
import com.itheima.controller.UserController;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class AnnotationTest {
public static void main (String[] args){
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
UserController userController = (UserController) applicationContext.getBean("userController");
userController.save();
}
}
2.1 在com.itheima包下创建Student类,在类中定义id和name字段,并使用@PostConstruct指定初始化方法,使用@PreDestroy指定Bean销毁前的方法。
package com.itheima;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
@Component("student")
public class Student {
@Value("1")
private String id;
@Value("张三")
private String name;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@PostConstruct
public void init(){
System.out.println("Bean对象的初始化完成,调用init()的方法");
}
@PreDestroy
public void destroy(){
System.out.println("Bean销毁调用destroy()方法");
}
public String toString(){
return "id="+id+",name="+name;
}
}
2.2 在src/main/resources目录下创建applicationStudent.xml,在该文件中引入Context约束并启动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"
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 命名空间 ,在配置文件中开启相应的注解处理器 -->
<context:component-scan base-package="com.itheima" />
</beans>
2.3 编写测试类StudentTest.java
package com.itheima;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class StudentTest {
public static void main (String[] args){
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationStudent.xml");
Student student = (Student) applicationContext.getBean("student");
System.out.println(student);
AbstractApplicationContext ac=(AbstractApplicationContext) applicationContext;
ac.registerShutdownHook();
}
}