1 概述
2 代码演练
3 代码解析
1 概述
1.1 bean注解相关
a context:component-scan标签使用
问:该标签的作用是什么?
答:该标签作用是支持注解,在xml配置文件中不用配置bean了
问:该标签的使用条件是什么?
答:spring3.0之后才支持该标签的使用
b 类注解相关
@Component 通用类注解(所有实体类都可以用该注解)
@Repository 注解dao类(持久层)
@Service 注解Service类(服务层)
@Controller 注解Controller类(控制层)
1.2 bean的作用域注解实现
问:该标签的使用条件是什么?
答:spring2.5 之后才支持该标签的使用
2 代码演练
2.1 注解实现(因为没有用xml bean的注入,并且没有自定义bean名称(实体类component 注解后没有变量),测试类默认小驼峰)
实体类
package com.imooc.beanannotation; import org.springframework.stereotype.Component; //因为不知道是什么类(dao类或者service类),所以用组件 通用的注解 @Component @Component public class BeanAnnotation { public void say(String word){ System.out.println("爱生活,爱老婆---"+word); } }
配置文件:(有了context:component-scan 标签之后不再使用context:annotation-config。前者是扫描基于类的注解,后者是完成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:component-scan base-package="com.imooc.beanannotation"></context:component-scan> </beans>
测试类(获取bean的样式为小驼峰,因为实体类没有配置组件后的变量)
package com.imooc.beanannotation; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.BlockJUnit4ClassRunner; import com.imooc.test.base.UnitTestBase; @RunWith(BlockJUnit4ClassRunner.class) public class TestBeanAnnotation extends UnitTestBase{ public TestBeanAnnotation() { super("classpath*:spring-beanannotation.xml"); // TODO Auto-generated constructor stub } /** * 注意:此处getBean 为 类的小驼峰形式 */ @Test public void testbeanAnnotation(){ try { BeanAnnotation bAnnotation = super.getbean("beanAnnotation"); bAnnotation.say("褒姒"); } catch (Exception e) { // TODO: handle exception } } }
打印结果:
三月 06, 2019 7:14:13 上午 org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@409c8a10: startup date [Wed Mar 06 07:14:13 CST 2019]; root of context hierarchy
三月 06, 2019 7:14:13 上午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from URL [file:/F:/xiangmu3/Xin/FuQiang/Spring/ddwei-dao/target/classes/spring-beanannotation.xml]
爱生活,爱老婆---褒姒
三月 06, 2019 7:14:13 上午 org.springframework.context.support.ClassPathXmlApplicationContext doClose
信息: Closing org.springframework.context.support.ClassPathXmlApplicationContext@409c8a10: startup date [Wed Mar 06 07:14:13 CST 2019]; root of context hierarchy
2.2 注解实现( 自定义bean名称(实体类component 注解后有变量),测试类测试时使用bean自定义名称)
实体类:
package com.imooc.beanannotation; import org.springframework.stereotype.Component; //因为不知道是什么类(dao类或者service类),所以用组件 通用的注解 @Component @Component("beanName") public class BeanAnnotation { public void say(String word){ System.out.println("爱生活,爱老婆---"+word); } }
测试类:
package com.imooc.beanannotation; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.BlockJUnit4ClassRunner; import com.imooc.test.base.UnitTestBase; @RunWith(BlockJUnit4ClassRunner.class) public class TestBeanAnnotation extends UnitTestBase{ public TestBeanAnnotation() { super("classpath*:spring-beanannotation.xml"); // TODO Auto-generated constructor stub } /** * 注意:此处getBean 为 类的小驼峰形式 */ @Test public void testbeanAnnotation(){ try { BeanAnnotation bAnnotation = super.getbean("beanName"); bAnnotation.say("褒姒"); } catch (Exception e) { // TODO: handle exception } } }
打印结果:(1.1打印结果相同)
2.3 bean的作用域注解实现(prototype)
实体类:
package com.imooc.beanannotation; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; //因为不知道是什么类(dao类或者service类),所以用组件 通用的注解 @Component @Scope("prototype") @Component("beanName") public class BeanAnnotation { public void say(String word){ System.out.println("爱生活,爱老婆---"+word); } //打印出hashCode public void getHashCodeProtype(){ System.out.println("hashCode码值为:---"+this.hashCode()); } }
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"> <context:component-scan base-package="com.imooc.beanannotation"></context:component-scan> </beans>
测试类:
package com.imooc.beanannotation; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.BlockJUnit4ClassRunner; import com.imooc.test.base.UnitTestBase; @RunWith(BlockJUnit4ClassRunner.class) public class TestBeanAnnotation extends UnitTestBase{ public TestBeanAnnotation() { super("classpath*:spring-beanannotation.xml"); // TODO Auto-generated constructor stub } /** * 注意:此处getBean 为 类的小驼峰形式 */ @Test public void testbeanAnnotation(){ try { BeanAnnotation bAnnotation = super.getbean("beanName"); bAnnotation.say("褒姒"); } catch (Exception e) { // TODO: handle exception } } @Test public void testbeanAnnotationGetScope(){ try { BeanAnnotation bAnnotation = super.getbean("beanName"); bAnnotation.getHashCodeProtype(); bAnnotation = super.getbean("beanName"); bAnnotation.getHashCodeProtype(); } catch (Exception e) { // TODO: handle exception } } }
打印结果:
三月 08, 2019 6:16:46 上午 org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh 信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@3f64fffc: startup date [Fri Mar 08 06:16:46 CST 2019]; root of context hierarchy 三月 08, 2019 6:16:46 上午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions 信息: Loading XML bean definitions from URL [file:/F:/xiangmu3/Xin/FuQiang/Spring/ddwei-dao/target/classes/spring-beanannotation.xml] hashCode码值为:---2137315958 三月 08, 2019 6:16:47 上午 org.springframework.context.support.ClassPathXmlApplicationContext doClose 信息: Closing org.springframework.context.support.ClassPathXmlApplicationContext@3f64fffc: startup date [Fri Mar 08 06:16:46 CST 2019]; root of context hierarchy hashCode码值为:---910342737
2.4 bean的作用域注解实现(singleton)
实体类:
package com.imooc.beanannotation; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; //因为不知道是什么类(dao类或者service类),所以用组件 通用的注解 @Component //@Scope("prototype") @Scope("singleton") @Component("beanName") public class BeanAnnotation { public void say(String word){ System.out.println("爱生活,爱老婆---"+word); } //打印出hashCode public void getHashCodeProtype(){ System.out.println("hashCode码值为:---"+this.hashCode()); } }
xml配置文件(同2.3)
测试类:(同2.3)
打印结果:
三月 08, 2019 6:19:15 上午 org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh 信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@3f64fffc: startup date [Fri Mar 08 06:19:15 CST 2019]; root of context hierarchy 三月 08, 2019 6:19:15 上午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions 信息: Loading XML bean definitions from URL [file:/F:/xiangmu3/Xin/FuQiang/Spring/ddwei-dao/target/classes/spring-beanannotation.xml] hashCode码值为:---1939979416 hashCode码值为:---1939979416 三月 08, 2019 6:19:15 上午 org.springframework.context.support.ClassPathXmlApplicationContext doClose 信息: Closing org.springframework.context.support.ClassPathXmlApplicationContext@3f64fffc: startup date [Fri Mar 08 06:19:15 CST 2019]; root of context hierarchy
3 代码解析
3.1 2.1的例子,注解注入默认
a 实体类: 使用@Component组件
b xml配置文件: <context:component-scan base-package="com.imooc.beanannotation"></context:component-scan>
(引入xml相关声明,详细见2.1例子 spring3.0已上才支持)
c 测试类: 实体类@Component后边没有定义bean时,如何获取bean
3.2 2.2的例子,注解注入定义bean
a 实体类: 使用@Component("beanName")组件
b xml配置文件: <context:component-scan base-package="com.imooc.beanannotation"></context:component-scan>
(引入xml相关声明,详细见2.1例子 spring3.0已上才支持)
c 测试类: BeanAnnotation bAnnotation = super.getbean("beanName"); (注解@Component定义bean时,如何获取bean)
3.3 2.3的例子,作用域多例的使用
a 实体类: @Scope("prototype")
3.4 2.4的例子,作用域单例的使用
a 实体类: @Scope("singleton")