Spring框架第四篇之基于注解的DI注入

一、说明

与@Component注解功能相同,但意义不同的注解还有三个:

1)@Repository:注解在Dao实现类上
2)@Service:注解在Service实现类上
3)@Controller:注解在SpringMVC的处理器上

Bean作用域:
@Scope("prototype"):用于指定对象创建模式,可以是单例模式或者原型模式,默认是singleton

基本类型属性注入:
@Value

@Autowired:byType方式的注解式注入,即根据类型注解
@Qualifier("mySchool"):byName方式的注解式注入,在使用@Qualifier时必须与@Autowired联合使用

域属性注解:
@Resource:不加name属性则为byType方式的注解式注入,但前提是注入的对象只能有一个
@Resource(name="mySchool"):byName方式的注解式注入

Bean的生命始末:
@PostConstruct:当前Bean初始化刚完毕
@PreDestroy:当前Bean即将被销毁

@Configuration:表示当前类充当Spring容器,即所有的Bean将由这个类来创建

注意:

  在举例之前声明几个问题:

  1、注解需要依赖spring-aop-4.3.9.RELEASE.jar包,所以需要导入依赖包。

  2、使用注解方式注入,配置文件需要添加约束头文件:

<?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">

  也可以自己从Spring的说明文档中找到此头文件:

  3、如果使用到了SpringJUnit4测试,则还需要导入spring-test-4.3.9.RELEASE.jar包

二、举例

1、首先创建一个School类:

package com.ietree.spring.basic.annotation.demo1;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component("mySchool")
public class School {

    @Value(value = "清华大学")
    private String name;

    public School() {
        super();
    }

    public School(String name) {
        super();
        this.name = name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "School [name=" + name + "]";
    }

}

创建Student类:

package com.ietree.spring.basic.annotation.demo1;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.annotation.Resource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

/**
 * 说明:
 * 与@Component注解功能相同,但意义不同的注解还有三个:
 * 1)@Repository:注解在Dao实现类上
 * 2)@Service:注解在Service实现类上
 * 3)@Controller:注解在SpringMVC的处理器上
 *
 * Bean作用域:
 * @Scope("prototype"):用于指定对象创建模式,可以是单例模式或者原型模式,默认是singleton
 *
 * 基本类型属性注入:
 * @Value
 *
 * @Autowired:byType方式的注解式注入,即根据类型注解
 * @Qualifier("mySchool"):byName方式的注解式注入,在使用@Qualifier时必须与@Autowired联合使用
 *
 * 域属性注解:
 * @Resource:不加name属性则为byType方式的注解式注入,但前提是注入的对象只能有一个
 * @Resource(name="mySchool"):byName方式的注解式注入
 *
 * Bean的生命始末:
 * @PostConstruct:当前Bean初始化刚完毕
 * @PreDestroy:当前Bean即将被销毁
 */
//@Scope("prototype")
@Component("myStudent")
public class Student {

    @Value(value = "小明")
    private String name;

    @Value(value = "25")
    private int age;

    //    @Autowired
    //    @Qualifier("mySchool")
    //    @Resource(name="mySchool")
    @Resource
    private School school;// 对象属性,也叫做域属性

    public Student() {
        super();
    }

    public Student(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }

    public void setName(String name) {
        System.out.println("执行setName()");
        this.name = name;
    }

    public void setAge(int age) {
        System.out.println("执行setAge()");
        this.age = age;
    }

    public void setSchool(School school) {
        this.school = school;
    }

    @Override
    public String toString() {
        return "Student [name=" + name + ", age=" + age + ", school=" + school + "]";
    }

    @PostConstruct
    public void initAfter(){
        System.out.println("当前Bean初始化刚完毕");
    }

    @PreDestroy
    public void preDestroy(){
        System.out.println("当前Bean即将被销毁");
    }
}

创建MyJavaConfig类:

package com.ietree.spring.basic.annotation.demo1;

import org.springframework.beans.factory.annotation.Autowire;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @Configuration:表示当前类充当Spring容器,即所有的Bean将由这个类来创建
 */
@Configuration
public class MyJavaConfig {

    @Bean(name="mySchool")
    public School mySchoolCreator(){
        return new School("清华大学");
    }

    // autowire=Autowire.BY_TYPE:指从当前类这个容器中查找与域属性的类型具有is-a关系的Bean
    // autowire=Autowire.BY_NAME:指从当前类这个容器中查找与域属性同名的Bean
    @Bean(name="myStudent", autowire=Autowire.BY_TYPE)
    public Student myStudentCreator(){
        return new Student("小明", 25);
    }
}

创建配置文件:

<?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">

    <!-- 扫描 com.ietree.spring.basic.annotation.demo1这个包及其子包 -->
    <context:component-scan base-package="com.ietree.spring.basic.annotation.demo1"/>

    <!-- 扫描 com.ietree.spring.basic这个包的子包 -->
    <context:component-scan base-package="com.ietree.spring.basic.*"/>

</beans>

创建测试类:

package com.ietree.spring.basic.annotation.demo1;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations="classpath:com/ietree/spring/basic/annotation/demo1/applicationContext.xml")
public class MyTest {

    @Autowired
    private Student student;

    @Test
    public void test01() {

        String resource = "com/ietree/spring/basic/annotation/demo1/applicationContext.xml";
        ApplicationContext ctx = new ClassPathXmlApplicationContext(resource);

        School school = (School) ctx.getBean("mySchool");
        System.out.println(school);

        Student student = (Student) ctx.getBean("myStudent");
        System.out.println(student);

        ((ClassPathXmlApplicationContext)ctx).close();
    }

    public void test02(){
        System.out.println(student);
    }

}
时间: 2024-11-08 20:23:32

Spring框架第四篇之基于注解的DI注入的相关文章

Spring声明式事务管理(基于注解方式实现)

----------------------siwuxie095 Spring 声明式事务管理(基于注解方式实现) 以转账为例 1.导入相关 jar 包(共 10 个包) (1)导入核心 jar 包和日志相关的 jar 包 (2)导入 JdbcTemplate 的 jar 包 (3)导入 MySQL 的 JDBC 驱动包 mysql-connector-java 下载链接: https://dev.mysql.com/downloads/connector/j/ (4)导入 AOP 的 jar

Spring框架基本概念之POJO,EJB,DI,AOP,IOO,JCA

1.POJO(Plain Old Java Object),一个正规的Java对象(不是JavaBean,EntityBean等),该对象也不担当任何的特殊的角色,也不实现任何Java框架指定的接口. POJO不是我们开始认为的JavaBean,当然更不是EJB,它不依赖于框架(即继承或实现某些框架类或接口).例如:Struts1中的Action和ActionForm当然不属于POJO了,而在Struts2中的Action由于可以不继承任何的接口,所以在这种情况下Action是POJO,但是St

spring下应用@Resource, @Autowired 和 @Inject注解进行依赖注入的差

代码: 为了探寻  '@Resource', '@Autowired', 和'@Inject'如何解决依赖注入中的问题,我创建了一个"Party"接口,和它的两个实现类"Person","Organization".这样我就可以在注入Bean的时候不必使用具体类型(指使用接口类型即可).这样做也方便我研究当一个接口有多个实现类与之匹配的时候Spring是如何解决依赖注入的不确定性的. public interface Party {} packa

Spring框架总结(四)——注解

前面几节,通过配置xml文件,可以实现Spring 控制反转的依赖注入.不过,如果一个类中,存在很多属性.依赖不止一个目标,此时这种基于xml配置的方式就显得非常繁琐.幸好,Spirng提供了几种技巧,可以帮助我们减少xml的配置数量 自动装配(autowiring)有助于减少甚至消除配置<property>元素和<constructor-arg>元素,让spring自动识别如何装配Bean的依赖关系 自动检测(autodiscovery)比自动装配更进了一步,让Spring能够自

Spring的AspectJ的AOP,基于注解(9.1)重点掌握

什么是AspectJ AspectJ是一个面向切面的框架,它扩展了Java语言.AspectJ定义了AOP语法所以它有一个专门的编译器用来生成遵守Java字节编码规范的Class文件.AspectJ是一个基于Java语言的AOP框架Spring2.0以后新增了对AspectJ切点表达式支持@AspectJ 是AspectJ1.5新增功能,通过JDK5注解技术,允许直接在Bean类中定义切面新版本Spring框架,建议使用AspectJ方式来开发AOP AspectJ表达式: 语法:executi

Spring框架第四天

html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption

SPRING学习(十九)--基于注解的AOP切面编程

上篇中介绍了基于XML配置的AOP切面编程,除了XML配置AOP切面编程外,还可以通过注解方式实现AOP切面编程,本篇通过一个小例子来介绍基于注解的AOP编程. 1.在spring中使用AOP变成,不止要导入spring-aop.jar,还需要导入spring-aspects.jar.aspectjweaver.jar和aopalliance.jar,但是aspectjweaver.jar被spring-aspects.jar依赖,aopalliance.jar被spring-aop.jar依赖

spring框架的bean管理常用的注解

1.除了导入spring四个核心以及日志jar包外,还需要导入aop包 2.在配置文件中添加注解扫描 扫描指定包下的注解 <context:component-scan base-package=" * "></context:component-scan> 扫描属性上的注解 <context:annotation-config></context:annotation-config> 3.作用在类上面的注解(用于创建对象使用,value

解决Spring框架的Dao层改用@Repository注解,无法使用JdbcDaoSupport的问题

目的: 想改用spring框架强大的注解功能(@Repository注解)来实现自动注册dao的bean的功能(原来是在xml中配置的).改完之后,运行的时候直接报错: Error creating bean with name 'UserVODao' defined in file [D:\JSP_MyEclipse\.metadata\.me_tcat7\webapps\XYG_WEBDEV_SAMPLE\WEB-INF\classes\com\xinyiglass\springSample