Spring基于注解开发总结

本文介绍了Spring框架中基于注解的开发方式,包括半注解半XML配置和全注解实现依赖注入。详细讲解了@Component、@Scope等关键注解的使用,并通过实例展示了如何在不使用XML配置的情况下完成bean的注册和管理。

前言

Spring是我们开发中的核心框架,传统的xml配置文件十分繁琐,所以在Spring2.5以后,程序员可以使用注解来配置依赖注入,而不是大量的在xml文件中配置,我们可以使用相关类、方法或字段的注解,将繁琐的xml配置移植到类本身。

方式一:半注解半xml配置文件实现依赖注入

首先,先来介绍一些必要的注解及其使用。
@Component
该注解使用于类上面,相当于配置文件中的:

<bean class=""/>

那么如何给bean的id赋值呢?我们不妨从@Component源代码中寻找答案

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Indexed
public @interface Component {

	/**
	 * The value may indicate a suggestion for a logical component name,
	 * to be turned into a Spring bean in case of an autodetected component.
	 * @return the suggested component name, if any (or empty String otherwise)
	 */
	String value() default "";

}

可以看到,类中有一个value属性,而且默认为"",它就表示bean的id属性。当我们需要给bean赋id值的时候,我们通过在注解中给value赋值。比如:

@Component(value = “xxx”)

也可以这样写:

@Component(“xxx”)

@Component泛指各种组件,此注解还衍生出了三个和它一样的注解:
@Controller 一般用于表现层(web层)的注解
@Service 一般用于业务层(service层)的注解
@Repository 一般用于持久层(dao层)的注解
@Scope
@Scope注解的作用就是来调节对象的作用域。
此注解可以指定五种作用域

1. singleton单例模式(默认)
仅有一个该类的实例
2. prototype在这里插入代码片原型模式
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
3. request
每一次http请求都会产生一个新的bean,作用域相当于servlet中的request作用域
4. session
每一次http请求都会产生一个新的bean,作用域相当于servlet中的session作用域
5. global session
在web中相当于session类型

举例
我们以学生和学校为例,先创建学校类School:

@Component("school")
public class School {
    @Value("bju")
    private String name;

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

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

创建学生类Student:

@Component("student")
@Scope(value = "prototype")
public class Student {
    @Value("zhangsan")
    private String name;
    @Value("15")
    private int age;
    @Resource(name = "school")
    private School school;

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public School getSchool() {
        return school;
    }

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

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

需要注意的是xml配置文件:

	<context:annotation-config></context:annotation-config>
    <context:component-scan base-package="com.jiawen"/>

这两项配置缺一不可,有了它们,Spring才会扫描并识别出你的注解。
测试代码:

	@Test
    public void test(){
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        Student student = (Student) context.getBean("student");
        System.out.println(student);
    }

运行结果:

Student{name=‘zhangsan’, age=15, school=School{name=‘bju’}}

方式二:全注解实现依赖注入

同样,我们介绍一下必要的注解及其使用。
@Configuration
Configuration的主要功能是用来注册Bean,它使用在类的上面,相当于一个Spring的XML配置文件,与@Bean配合使用。
@Bean
Spring的@Bean注解用于告诉方法,产生一个Bean对象,然后这个Bean对象交给Spring管理。产生这个Bean对象的方法Spring只会调用一次,随后这个Spring将会将这个Bean对象放在自己的IOC容器中。
可以通过@Bean(name = “xxx”)的方式来指定bean的id属性
@Bean需要在@Configuration注解下的类使用。
@ComponentScan
此注解相当于xml配置文件中的 <context:component-scan base-package="com.jiawen"/>
使用此注解时,我们要指定base-package属性,用法为:

@ComponentScan(basePackages = “xxx.xxxx…”)

举例
我们仍以学校和学生为例,上文中的School和Student类不变,我们新增加一个beans类:

@Configuration
@ComponentScan(basePackages = "com.jiawen")
public class beans {
    @Bean(name = "school")
    public School getSchool(){
        return new School();
    }

    @Bean(name = "student")
    public Student getStudent(){
        return new Student();
    }
}

测试代码:

	@Test
    public void test(){
        ApplicationContext context = new AnnotationConfigApplicationContext(beans.class);
        Student student = (Student) context.getBean("student");
        System.out.println(student);
    }

与上种方式测试代码不同的是,这次我们使用了AnnotationConfigApplicationContext,当我们使用全注解开发时,就不能再使用ClassPathXmlApplicationContext了。
运行结果:

Student{name=‘zhangsan’, age=15, school=School{name=‘bju’}}

总结

基于注解开发是我们必须要掌握的技能,无论是全xml配置、半注解半xml配置还是全注解方式,都有它的优点与弊端。我们在实际开发中,千万不能“随自己喜欢的方式”或者“图方便”,一定要根据项目的具体情况来决定用哪种方式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

九天漩女

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值