欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Spring注解开发以及基于java的容器配置

程序员文章站 2024-01-03 11:35:52
...

Spring4后的注解开发

使用bean.xml实现注解开发

需要导入aop包(如果没有导入该包,注解无效)

Spring注解开发以及基于java的容器配置
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 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.zhbit.pojo"/>
<!--<context:annotation-config></context:annotation-config>-->

</beans>

注意点:当加入了<context:component-scan base-package="com.zhbit.pojo"/>,可以不再加入<context:annotation-config></context:annotation-config>。Spring注解开发以及基于java的容器配置
component-scan包含了标签annotation-config

@Component

创建User类

package com.zhbit.pojo;

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

/*@Component 组件 等价于 <bean id="user" class="com.zhbit.pojo.User"/> 不需要在bean.xml文件里显示声明这句话了 */
@Component
public class User {
    @Value("小明")
    //等价于<property name="name" value="小明"/>
    public String name;
}

beans.xml中不需要加入任何bean标签
编写测试类MyTest.class

import com.zhbit.pojo.User;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MyTest {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        User user = context.getBean("user",User.class);
        System.out.println(user.name);
    }
}

测试结果
Spring注解开发以及基于java的容器配置

@Component的衍生注解

dao层(持久层) ——> @Repository
service层(业务逻辑层) ——>@Service
controll层(表现层) ——>@Controller
@Component 为最普通组件,可以被注入到spirng容器进行管理
四个注解的功能大致一样,都是讲某个类注册到spring中,装配Bean,只不过前面三个更加细化

自动装配置

@Autowired:优先默认通过类型,如果找不到类型,再找名字。@Autowired注解默认字段不能为空,若想让字段可以为空,则加上@Autowired(required=false)
@Qualifier:和@AutoWired注解配合使用,当@Autowired注解不能唯一装配上Bean的时候(同一个类型多个name),这时候通过@Qualifier(value=“xxx”)
@Nullable:表明字段可以为null
@Resource:先通过名字装配Bean,若找不到,再通过类型装配
@Primary:(通过官网代码解释)

@Configuration
public class MovieConfiguration {

    @Bean
    @Primary
    public MovieCatalog firstMovieCatalog() { ... }

    @Bean
    public MovieCatalog secondMovieCatalog() { ... }

    // ...
}

With the preceding configuration, the following MovieRecommender is autowired with the firstMovieCatalog:(movieCatalog自动装配上firstMovieCatalog)

public class MovieRecommender {

    @Autowired
    private MovieCatalog movieCatalog;

    // ...
}

@Primary指示当多个bean是要自动装配到单值依赖项的候选对象时,应给予特定bean优先权。如果候选对象中仅存在一个主bean,则它将成为自动装配的值。

作用域@Scope

Spring注解开发以及基于java的容器配置

基于java 的容器配置

Spring的新Java配置支持中的主要工件是-带 @Configuration注释的类和-带@Bean注释的方法。

该@Bean注释被用于指示一个方法实例,可以配置,并初始化到由Spring IoC容器进行管理的新对象。对于那些熟悉Spring的XML配置的人来说,@Bean注释的作用与元素相同。您可以@Bean对任何Spring 使用带注释的方法 @Component。但是,它们最常与
@Configurationbean一起使用。

不适用注解开发

上代码
User.class

package com.zhbit.pojo;

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

public class User {
    @Value("小明")
    private String name;

    public String getName() {
        return name;
    }

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

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

config.class

package com.zhbit.config;

import com.zhbit.pojo.User;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class config {
    @Bean
    public User myUser(){
        return new User();
    }
}


/*
上述config类等价于以下Spirng<beans/>XML:
<beans>
    <bean id="myUser" class="com.zhbit.config.config"/>
</beans>
*/


测试类MyTest.class

import com.zhbit.config.config;
import com.zhbit.pojo.User;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;


public class MyTest {
    public static void main(String[] args) {
        ApplicationContext context = new AnnotationConfigApplicationContext(config.class);
        User user = (User) context.getBean("myUser");
        System.out.println(user.getName());


    }
}

ClassPathXmlApplicationContext可以将@Configuration类用作输入AnnotationConfigApplicationContext,这允许完全不使用XML来使用Spring容器
测试结果(成功注入):
Spring注解开发以及基于java的容器配置

注解开发

直接上代码
编写User.class

package com.zhbit.pojo;

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

public class User {
    @Value("小明")
    private String name;

    public String getName() {
        return name;
    }

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

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

编写Student.class

package com.zhbit.pojo;

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

@Component
public class Student {
    @Value("小红")
    private String name;

    public String getName() {
        return name;
    }

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

编写config.class

package com.zhbit.config;

import com.zhbit.pojo.User;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@ComponentScan("com.zhbit.pojo")
public class config {
    @Bean
    public User myUser(){
        return new User();
    }
}


/*
上述config类等价于以下Spirng<beans/>XML:

<beans>
    <context:component-scan base-package="com.acme"/>
    <bean id="myUser" class="com.zhbit.config.config"/>
</beans>
*/

这里面加入了组件扫描,只用了注解注册Student组件,User还是用了bean注册,方便对比
编写MyTest.class

import com.zhbit.config.config;
import com.zhbit.pojo.Student;
import com.zhbit.pojo.User;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;


public class MyTest {
    public static void main(String[] args) {
        ApplicationContext context = new AnnotationConfigApplicationContext(config.class);
        User user = (User) context.getBean("myUser");
        Student student = context.getBean("student",Student.class);
        System.out.println(user.getName());
        System.out.println(student.getName());

    }
}

测试结果(成功注入)
Spring注解开发以及基于java的容器配置
springboot中常常看见这种方法

xml与注解总结

xml比较万能,适用于任何场合,维护简单方便
注解维护相对复杂
xml与注解最佳实践:xml管理bean的注册,注解只负责注入属性

相关标签: spring java

上一篇:

下一篇: