【SSM】Spring的Bean管理
目录
一、Spring的Bean管理(XML)方式
有三种方式:使用类的构造器方式(默认为无参)
使用静态工厂方法实例化(简单工厂模式)
使用实例工厂方法实例化(工厂方法模式)
①:使用类的构造器方式
首先创建一个Bean1类
public class Bean1 {
public Bean1(){
System.out.println("Bean1被实例化!");
}
}
在配置文件中添加该类
<?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实例化的三种方式 -->
<!-- 第一种,无参构造器模式 -->
<bean id="bean1" class="com.xyz.ioc.demo02.Bean1">
</bean>
</beans>
测试:运行下面代码就会看到控制台输出“Bean1被实例化!”,表明调用了Bean1的构造方法。
public class test {
@Test
private void demo1(){
//创建工厂
ApplicationContext applicationContext = new ClassPathXmlApplicationContext
("applicationContext.xml");
Bean1 bean1 = (Bean1) applicationContext.getBean("bean1");
}
}
②: 使用静态工厂方法实例化(简单工厂模式)
首先创建Bean2对象类
public class Bean2 {
}
为Bean2提供一个静态工厂
public class Bean2Factory {
public static Bean2 createBean2(){
System.out.println("执行了BeanFactory方法");
return new Bean2();
}
}
在配置文件中添加
测试
@Test
public void demo02(){
ApplicationContext applicationContext = new ClassPathXmlApplicationContext
("applicationContext.xml");
Bean2 bean2 = (Bean2) applicationContext.getBean("bean2");
}
⑤ :使用实例工厂方法实例化(工厂方法模式)
首先创建Bean3对象类
public class Bean3 {
}
为Bean2提供一个实例工厂
public class Bean3Factory {
public Bean3 createBean3(){
System.out.println("Bean3的工厂被执行了");
return new Bean3();
}
}
在配置文件中添加
<bean id="bean3Factory" class="com.xyz.bean.Bean3Factory"/>
<bean id="bean3" factory-bean="bean3Factory" factory-method="createBean3"/>
测试
@Test
public void demo03(){
ApplicationContext applicationContext = new ClassPathXmlApplicationContext
("applicationContext.xml");
Bean3 bean3 = (Bean3) applicationContext.getBean("bean3");
}
总结:静态工厂和实例工厂最大的区别就是创建实例的方法是否式静态的
由于实例工厂的创建实例方法不是静态的,所以在配置文件中先要获取工厂的实例才能去创建对象
2.Bean标签的常用配置
id和name属性:都是用来给每个Bean取一个别名,区别是name支持特殊字符。
class:用于设置一个类的完全路径名称,主要作用是IOC容器生成类的实例
scope:该属性用于决定Bean的作用域,默认为singleton单例模式
init-method:当类被初始化时会调用该方法
destroy-method:当类被销毁时会调用该方法
二、Spring的Bean管理(注解)方式
1.注解方式创建Bean
首先要修改配置文件,相对于上面XML方式,注解方式需要在配置文件导入注解的约束
使用<context/>标签用于扫描制定的包
<?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="com.xyz.bean"/>
</beans>
创建一个UserService类(在类上使用@Component注解,括号里的"userService"相当于XML中<Bean/>的id)
@Component("userService")
public class UserService {
public void sayHello(String name){
System.out.println("Hello"+name);
}
}
测试
@Test
public void demo(){
ApplicationContext applicationContext = new
ClassPathXmlApplicationContext("applicationContext.xml");
UserService userService = (UserService) applicationContext.getBean("userService");
userService.sayHello("张三");
}
可以发现注解方式比XML方式简便很多,Spring除了@Component外,还提供了3个功能基本和@Component等效的注解
@Repository 用于对DAO实现类进行标注
@Service 用于对Service实现类进行标注
@Controller 用于对Controller实现类进行标注
2.其他注解
@PostConstruct:在初始化前会调用该注解标记的方法
@PreDestory:在销毁前会调用该注解标记的方法
@Scope:用于指定Bean的作用范围
三、Spring容器中Bean的生命周期
四、XML与注解方式的混合使用
XML优势:结构清晰、易于阅读
注解优势:开发便捷、属性注入方便
由于XML和注解各有各的优势,所以一般开发中使用XML方式管理类、注解方式进行属性注入