Spring-03-bean的作用域和使用注解开发
六、Bean的作用域
-
Bean的作用域
6.1 singleton作用域
-
singleton是bean的默认作用域
-
不管你怎么使用,Spring容器在创建对象的时候只创建一个,每次从容器中获取的Bean都是同一个对象
6.2 prototype作用域
-
和singleton相对应的,每次从容器中获取对象时,Spring都会创建一个新的对象交给你
-
也就是说每次拿到的对象都是不同的对象
6.3 其他的作用域
-
request, session, application, websocket 这些作用域只有在使用Spring-web容器时才会生效,不然则会抛出异常
-
Request
-
当一个bean的作用域为Request,表示在一次HTTP请求中,一个bean定义对应一个实例;
-
即每个HTTP请求都会有各自的bean实例,它们依据某个bean定义创建而成。
<bean id="loginAction" class=cn.csdn.LoginAction" 1 scope="request"/>
-
针对每次HTTP请求,Spring容器会根据loginAction bean的定义创建一个全新的LoginAction bean实例,且该loginAction bean实例仅在当前HTTP request内有效,因此可以根据需要放心的更改所建实例的内部状态,而其他请求中根据loginAction bean定义创建的实例,将不会看到这些特定于某个请求的状态变化。当处理请求结束,request作用域的bean实例将被销毁。
-
-
Session
-
当一个bean的作用域为Session,表示在一个HTTP Session中,一个bean定义对应一个实例。
<bean id="userPreferences" class="com.foo.UserPreferences" scope="session"/>
-
针对某个HTTP Session,Spring容器会根据userPreferences bean定义创建一个全新的userPreferences bean实例,且该userPreferences bean仅在当前HTTP Session内有效。
-
与request作用域一样,可以根据需要放心的更改所创建实例的内部状态,而别的HTTP Session中根据userPreferences创建的实例,将不会看到这些特定于某个HTTP Session的状态变化。
-
当HTTP Session 最终被废弃的时候,在该HTTP Session作用域内的bean也会被废弃掉。
-
七、使用注解开发
7.1 准备工作
-
确保maven项目中已经正确的添加了aop依赖
-
在spring配置文件中,引入相关的约束
<?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 https://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"> <context:annotation-config/> </beans>
7.2 注册Bean
-
告诉Spring,哪些类需要被托管
<!--选择需要扫描注解的包--> <context:component-scan base-package="com.pbx.pojo"/>
-
在类名上添加
@Component
注解,如果注解中不传递名称,bean默认的id就是全小写的类名package com.pbx.pojo; import org.springframework.stereotype.Component; @Component("u1") public class User { private int id; private String name; }
-
对于这样配置的Bean,它的id为 “u1",如果没有给出,那么默认的id为user
-
扩展内容
@Component
注解有三个衍生注解,他们分别对应了web开发中的三个层,不过功能都是一样的@Controller
—— web层@Service
—— service层@Repository
—— dao层
7.3 注入属性值
-
在需要注入值的属性或者setter方法上使用
@Value()
进行注入属性值 -
通过注解属性,只能实现一些值的注入,不能注入引用类型以及List等复杂类型的属性
-
实体类
package com.pbx.pojo; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; @Component("u1") public class User { @Value("1") private int id; @Value("张三") private String name; @Override public String toString() { return "User{" + "id=" + id + ", name='" + name + '\'' + '}'; } }
-
测试
@Test public void test02() { ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml"); User u1 = context.getBean("u1", User.class); System.out.println(u1); }
7.4 @Autowired
-
@Autowired
注解是通过类型进行自动装配的,如果有多个同类型的bean,则需要配合@Qualifier(value = "beanid")
指定某个特定的bean -
实体类
public class People { private String name; @Autowired private Cat cat; @Autowired private Dog dog; }
-
beans.xml
<?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 https://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"> <context:annotation-config/> <bean id="cat1" class="com.pbx.pojo.Cat"> <property name="name" value="cat1"/> </bean> <bean id="dog1" class="com.pbx.pojo.Dog"> <property name="name" value="dog1"/> </bean> <bean id="people" class="com.pbx.pojo.People"> <property name="name" value="张三"/> </bean> </beans>
-
测试
@Test public void test01() { ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml"); People people = context.getBean("people", People.class); people.show(); }
7.5 作用域
@Scope
- singleton:默认的,Spring会采用单例模式创建这个对象。关闭工厂 ,所有的对象都会销毁。
- prototype:多例模式。关闭工厂 ,所有的对象不会销毁。内部的垃圾回收机制会回收
7.6 基于Java类配置Spring
-
以上都是使用xml文件和注解配合进行开发的。这里介绍的就是完全使用Java机制进行配置Spring,完全不需要xml文件
-
JavaConfig是通过Java类的方式来提供Bean的定义信息,不需要依赖任何的xml文件
-
编写配置类
@Configuration public class MyConfig { @Bean public User getUser() { return new User(); } }
-
实体类
@Component public class User { @Value("1") private int id; @Value("李四") private String name; @Override public String toString() { return "User{" + "id=" + id + ", name='" + name + '\'' + '}'; } }
-
测试
@Test public void test01() { ApplicationContext context = new AnnotationConfigApplicationContext(MyConfig.class); User getUser = context.getBean("getUser", User.class); System.out.println(getUser); }
-
注意
- 使用配置类配置Spring时,方法名就是原来bean标签中的id,返回值类型就是以前bean标签中的class