Spring学习九----------Bean的配置之Bean的定义及作用域的注解实现

Spring Bean常用注解

@Component:通常注解,可用于任何Bean

@Repository:通常用于注解DAO层,即持久层

@Service:通常用于注解Service层,即服务层

@Controller:通常用于注解Controller层,即控制层

类的自动检测及Bean的注册

<context:component-scan base-package=""/>:自动扫描base-package定义的包或其子包下的类,并将带有@Component,@Controller,@Service,@Repository等注解的类自动注册到IOC容器中。

<context:annotation-config/>:隐式的向Spring容器中注册AutowiredAnnotationBeanPostProcessor、CommonAnnotationBeanPostProcessor、PersistenceAnnotationBeanPostProcessor 和RequiredAnnotationBeanPostProcessor 这四个BeanPostProcessor。

<context:component-scan/>包含了<context:annotation-config/>,因此使用<context:component-scan/>就不用再使用<context:annotation-config/>

定义Bean

Bean名称由BeanNameGenerator生成(@Component,@Controller,@Service,@Repository都有个name属性用于显示的指定Bean Name;默认是类名首字母小写)

也可使用<context:component-scan/>中的name-generator自定义Bean的命名策略,但是要实现BeanNameGenerator接口并且包含一个无参构造器

作用域

@Scope注解标识Bean的作用域。默认是singleton。

实例

1.项目结构

2.pom.xml

<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/maven-v4_0_0.xsd">

	<modelVersion>4.0.0</modelVersion>

	<groupId>org.spring</groupId>
	<artifactId>Spring-BeanAnnotation</artifactId>
	<packaging>jar</packaging>
	<version>0.0.1-SNAPSHOT</version>
	<name>Spring-BeanAnnotation Maven Webapp</name>
	<url>http://maven.apache.org</url>

	<properties>
		<spring.version>4.3.7.RELEASE</spring.version>
	</properties>

	<dependencies>
		<!-- junit依赖 -->
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.12</version>
			<scope>test</scope>
		</dependency>
		<!-- spring核心依赖 -->
		<dependency>
		    <groupId>org.springframework</groupId>
		    <artifactId>spring-core</artifactId>
		    <version>${spring.version}</version>
		</dependency>
		<dependency>
		    <groupId>org.springframework</groupId>
		    <artifactId>spring-beans</artifactId>
		    <version>${spring.version}</version>
		</dependency>
		<dependency>
		    <groupId>org.springframework</groupId>
		    <artifactId>spring-context</artifactId>
		    <version>${spring.version}</version>
		</dependency>
	</dependencies>

	<build>
		<finalName>Spring-BeanAnnotation</finalName>
	</build>

</project>

3.spring-beanannotation.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
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">

    <!-- 自动扫描包下的Bean并注册到IOC容器中 -->
    <context:component-scan base-package="org.spring.annotation.bean"/>

</beans>

4.BeanAnnotation.java

package org.spring.annotation.bean;

import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

@Scope("prototype")
@Component
public class BeanAnnotation {

	public void say() {

		System.out.println("注解方式获取成功");

	}

	public void hasCode() {

		System.out.println("BeanAnnotation:" + this.hashCode());

	}

}

5.TestBase.java

package org.spring.annotation.test;

import org.junit.After;
import org.junit.Before;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.util.StringUtils;

public class TestBase {

	private ClassPathXmlApplicationContext context;
	private String xmlPath;

	/**
	 * 无参构造器
	 */
	public TestBase() {

	}

	/**
	 * 含参构造器,初始化配置文件路径
	 *
	 * @param xmlPath
	 * 					配置文件路径
	 */
	public TestBase(String xmlPath) {

		this.xmlPath = xmlPath;

	}

	/**
	 * 初始化spring的IOC容器
	 */
	@Before
	public void before() {

		if(StringUtils.isEmpty(xmlPath)) {//配置文件默认路径
			xmlPath = "classpath:spring-*.xml";
		}
		//加载配置文件到spring容器中
		context = new ClassPathXmlApplicationContext(xmlPath.split("[,\\s]+"));
		//启动IOC容器s
		context.start();

	}

	/**
	 * 销毁容器
	 */
	@After
	public void after() {

		if(context != null){
			context.destroy();
		}

	}

	/**
	 * 根据bean id获取bean对象
	 */
	public Object getBean(String id) {

		return context.getBean(id);

	}

}

6.TestBeanAnnotation.java

package org.spring.annotation.test;

import org.junit.Test;
import org.spring.annotation.bean.BeanAnnotation;

public class TestBeanAnnotation extends TestBase {

	/**
	 * 构造器传入spring配置文件路径
	 */
	public TestBeanAnnotation() {

		super("classpath:spring-beanannotation.xml");

	}

	/**
	 * 测试注解方式获取bean对象
	 */
	@Test
	public void testBeanAnnotation() {

		BeanAnnotation bean = (BeanAnnotation) super.getBean("beanAnnotation");
		bean.say();

	}

	/**
	 * 测试注解方式的Bean的作用域
	 */
	@Test
	public void testBeanScope() {

		BeanAnnotation bean = (BeanAnnotation) super.getBean("beanAnnotation");
		bean.hasCode();

		BeanAnnotation bean2 = (BeanAnnotation) super.getBean("beanAnnotation");
		bean2.hasCode();

	}

}

7.效果预览

参考:http://www.imooc.com/video/4030

时间: 2024-11-06 18:38:45

Spring学习九----------Bean的配置之Bean的定义及作用域的注解实现的相关文章

Spring学习(三)ioc工厂bean深入理解

一.ioc工厂配置的bean分类: 划分依据: getBean("xx") 调用某个bean对象返回的对象实例类型是否是class属性指向的类型 1.普通bean getBean("xxx") == class 属性 2.工厂bean getBean("xxx") != class属性 (class属性中指向的是一个工厂类,调用这个bean对象,想要的并不是class属性指向的工厂 ,而是该工厂负责创建的实例对象.) 二.工厂bean的必要性:

Spring学习之路(三)bean注解管理AOP操作

在类上面.方法上面.属性上面添加注解:并用bean来管理: 书写方法:@注解名称(属性名称=值) 第一步:导入jar包 导入spring-aop.jar(spring注解包): 第二步:创建实体类(注解对象) package com.aop; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; /** * value的值是自定义属性值 * @Co

Spring学习(5)---Bean的定义及作用域的注解实现

Bean管理的注解实现 Classpath扫描与组件管理 类的自动检测与注册Bean <context:annotation-config/> @Component,@Repository,@Service,@Controller @Required @Autowired @Qualifier @Resource (一) Classpath扫描与组件管理 从Spring3.0开始,Spring javaConfig项目提供了很多特性,包括使用java而不是xml定义bean,比如:@Confi

Spring 学习总结 使用静态工厂创建Bean

创建Bean时,class属性必须指定,此时为静态工厂类. factory-method指定静态工厂方法名. 接口: public interface Being { public void testBeing(); } Dog类 public class Dog implements Being{ private String msg; public void setMsg(String msg) { this.msg = msg; } @Override public void testBe

spring学习笔记(6)装配Bean 的种类和区别 【资源来自网络 版权非本人】

Bean的种类 1.普通Bean:之前操作的都是普通bean <bean  id="" class="A"> Spring 就直接创建A 然后返回 2.FactoryBean:是一个特殊的Bean,具有工厂生产对象的能力,但是只能生产特定的对象 bean必须实现Factorybean的接口,此接口提供一个getObject()来获得特定的bean. <bean id="" calss="Factorybean"

Spring中Bean的定义及作用域的注解实现

Classpath扫描与组件管理: 从Spring3.0开始,Spring JavaConfig项目提供了很多特性,包括使用java而不是xml定义bean,指的是注解 @Configuration,@Bean ,@Import ,@DependsOn @Component是一个通用注解,可用于任何bean @Repository:通常用于注解DAO类,即持久层 @Service:通常用于注解Service类,即服务层 @Controller:通常用于Controller类,即控制层MVC 元注

Bean的定义及作用域的注解实现

Classpath扫描与组件管理: 从Spring3.0开始,Spring JavaConfig项目提供了很多特性,包括使用java而不是xml定义bean,指的是注解 @Configuration,@Bean ,@Import ,@DependsOn @Component是一个通用注解,可用于任何bean @Repository:通常用于注解DAO类,即持久层 @Service:通常用于注解Service类,即服务层 @Controller:通常用于Controller类,即控制层MVC 元注

Spring学习四----------Bean的配置之Bean的配置项及作用域

Bean的作用域(每个作用域都是在同一个Bean容器中) 1.singleton:单例,指一个Bean容器中只存在一份(默认) 2.prototype:每次请求(每次使用)创建新的实例,destory方式不生效 3.request:每次http请求创建一个实例且仅在当前request内生效(只能在web中使用) 4.session:同上,每次http请求创建一个实例,当前session内有效(只能在web中使用) 5.global session:基于portlet的web中有效(portlet

spring学习笔记(5)装配Bean 实例工厂 【资源来自网络 版权非本人】

实例工厂:必须现有工厂的实例对象,通过实例对象创建对象.所有的方法都是非静态的(这一点和静态工厂有区别) (直接看代码) 工厂(和静态工厂的区别就是非静态 其他都一样) package c_inject.c_factory; /* * 实例工厂 */ public class MyBeanFactory { public UserService createService(){ return new UserserviceImpl(); } } 配置(配置和静态的有点区别  仔细看看吧 ) <?