-----持续更新Spring入门系列文章-----
如果你也喜欢Java和算法,欢迎订阅专栏共同学习交流!
你的点赞、关注、评论、是我创作的动力!
-------希望我的文章对你有所帮助--------
前言: 在前篇文章当中我们已经大概了解了Spring的基本原理和简单实例的编写测试,那么本篇将对Spring对于Bean的管理开展进一步的讲解和运用。
目录
一、什么是Bean?
1.1 Bean的配置
1.2 Bean的常用子元素
二、实例工厂实例化
2.1 引入pom依赖
2.2 创建一个类
2.3 创建工厂
2.4 配置applicationContext
2.5 工厂实例的测试类
2.6 测试结果
三、Bean的作用域
四、装配方式
4.1 基于XML的setter的注入
4.2 基于XML的构造方法的注入
4.3 基于注解的装配
五、注解实例
5.1 编写基本类
5.2 编写Dao层接口
5.3 编写Dao层实现类
5.4 编写ServiceDao层
5.5 编写Service实现类
5.6 编写Controller类
5.7 编写测试类
5.8 测试结果
六、总结
一、什么是Bean?
Bean是在Spring中注册的Java类,可以看做是添加到Spring容器里的一个管理对象。只有通过将Java类注册为其中的一个Bean时,也即是getBean()过程,才能使得Spring对其进行下一步管理。
1.1 Bean的配置
属性 | 描述 |
id | 即Bean对应的唯一标识符 |
name | 可以有多个名称,用逗号隔开,即代表Bean的内涵或作用 |
class | 即具体实现类,一般为对象的全路径 |
scope | Bean实例的作用范围,如singleton、prototype、request、session |
1.2 Bean的常用子元素
元素 | 描述 |
<constructor-arg> |
|
<property> |
|
<value> | 即上述两种注入方式对应的子元素的属性参数的赋值 |
<ref> | (同上) |
二、实例工厂实例化
工厂实例化,实际上也是将工厂类做为一个Bean注册到Spring容器中,通过控制工厂类来实现对于实例的创建,接下来演示一个实例工厂实例,可以让我们更好的了解工厂模式在Spring中的运作规。
2.1 引入pom依赖
代码略
2.2 创建一个类
package com.itheima;
public class Bean1 {
public Bean1() {
System.out.println("这是Bean1!");
}
}
2.3 创建工厂
创建一个工厂,构造方法显示当前实例正在生成,以及创建一个生成类的方法
package com.itheima;
public class MyBeanFactory {
public MyBeanFactory()
{
System.out.println("bean工厂实例化中!");
}
public Bean1 createBean()
{
return new Bean1();
}
}
2.4 配置applicationContext
注意此处将工厂类注册为一个Bean,填写其class后,将再次把工厂类作为一个Bean,使用factory-bean来标明工厂类,且已factory-method标明工厂方法。
<?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="MybeanFactory" class="com.itheima.MyBeanFactory"></bean>
<bean id="bean1" factory-bean="MybeanFactory" factory-method="createBean">
</bean>
</beans>
2.5 工厂实例的测试类
使用ApplicationContext作为Spring的容器,将注册的Bean注入,再通过获取Bean来实例化工厂类,以及自动实现工厂方法。
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {
public static void main(String args[])
{
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationBean1.xml");
System.out.println(applicationContext.getBean("bean1"));
}
}
2.6 测试结果
三、Bean的作用域
作用域 | 描述 |
singleton | 即单例模式,实际只创建一个实例 |
prototype | 即原型模式,每次请求都产生一个新的实例 |
request | 作用于Web,每一个HTTP请求都会有实例 |
session | 作用于Web,每一个HTTPSessioon请求都会有一个实例 |
global session | 作用于Web,限定为HTTPSession的生命周期 |
四、装配方式
4.1 基于XML的setter的注入
即上文中提到的setXX()以及getXX()的方法来进行赋值的方法,较为容易理解。
4.2 基于XML的构造方法的注入
即通过构造方法来对类中的成员变量进行直接的赋值的方法。
4.3 基于注解的装配
当一个项目的Bean过多时,通过XML的装配方式,会使得applicationContext文件中内容较为臃肿,那么此时就可以用到注解来解决相关问题。
以下是常用注解:
注解 | 描述 |
@Component | 即一个普通Bean,作用于任何层次 |
@Controller | 即控制组件Bean,用于控制层 |
@Service | 即业务逻辑Bean,用于业务层 |
@Repository | 即数据访问Bean,用于数据访问层 |
@Scope | 即Bean实例的作用域 |
@Value | 即Bean实例的注入值 |
@Autowired | 指自动装配对象 |
@Resource | 指要注入的对象 |
@PostConstruct | 指实例初始化完成之后调用的方法 |
@Qualifier | 自动装配的对象名称,通常与@Autowired联用 |
@PreDestory | 指实例销毁前调用的方法 |
五、注解实例
结构图:
5.1 编写基本类
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("Zhuang San")
private String name;
@Value("1234")
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 void setPassword(String password) {
this.password = password;
}
public String getPassword() {
return password;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", password='" + password + '\'' +
'}';
}
}
5.2 编写Dao层接口
package com.itheima.Dao;
public interface UserDao {
public void save();
}
5.3 编写Dao层实现类
package com.itheima.Dao;
import com.itheima.entity.User;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Repository;
@Repository("userDao")
public class UserDaoImpl implements UserDao {
public void save(){
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext2.xml");
User user=(User) applicationContext.getBean("user");
System.out.println(user);
System.out.println("Executing UserDaoImpl.save() ");
}
}
5.4 编写ServiceDao层
package com.itheima.Service;
public interface UserService {
public void save();
}
5.5 编写Service实现类
package com.itheima.Service;
import javax.annotation.Resource;
import com.itheima.Dao.UserDao;
import org.springframework.stereotype.Service;
@Service("userService")
public class UserServiceImpl implements UserService{
@Resource(name="userDao")
private UserDao userDao;
public void save(){
this.userDao.save();
System.out.println("Executing UserServiceImpl.save()");
}
}
5.6 编写Controller类
package com.itheima.Controller;
import com.itheima.Service.UserService;
import org.springframework.stereotype.Controller;
import javax.annotation.Resource;
@Controller
public class UserController {
@Resource(name="userService")
private UserService userService;
public void save(){
this.userService.save();
System.out.println("Executing UserController.save() ");
}
}
5.7 编写测试类
import com.itheima.Controller.UserController;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class AnnotationText {
public static void main(String args[]){
ApplicationContext applicationContext= new ClassPathXmlApplicationContext("applicationContext2.xml");
UserController userController=(UserController) applicationContext.getBean("userController");
userController.save();
}
}
5.8 测试结果
六、总结
本期文章主要是关于Bean的基本装配的了解,以及基于注解实现实例的讲解,对于Spring的运用也有更加深刻的理解,下次再见!
感谢爱学习的你看到了最后,点个赞、关注支持一下吧!