Spring注解开发常用注解

Spring注解开发快速入门回顾 一、Spring中的常用注解 @Component:使用在类上用于实例化Bean @Controller:使用在web层类上用于实例化Bean(作用于@Component一致) @Service:使用在service层类上用于实例化Bean(作用于@Componen

Spring注解开发快速入门回顾

一、Spring中的常用注解

@Component:使用在类上用于实例化Bean
@Controller:使用在web层类上用于实例化Bean(作用于@Component一致)
@Service:使用在service层类上用于实例化Bean(作用于@Component一致)
@Repository:使用在dao层类上用于实例化Bean(作用于@Component一致)
@Autowired:使用在字段上用于根据类型依赖注入
@Qualifier:结合@Autowired一起使用用于根据名称进行依赖注入
@Resource:相当于@Autowired+@Qualifier,按照名称进行注入
@Value:注入普通属性
@Scope:标注Bean的作用范围
@PostConstruct:使用在方法上标注该方法是Bean的初始化方法
@PreDestroy:使用在方法上标注该方法是Bean的销毁方法
以上的这些注解主要是替代 Bean 标签的配置。但是这些注解还不能全部替代xml配置文件,包括以下几个新注解:

@Configuration:用于指定当前类是一个Spring 配置类,当创建容器时会从该类上加载注解
@ComponentScan:用于指定Spring 在初始化容器时要扫描的包
@Bean:使用在方法上,标注将该方法的返回值存储到Spring 容器中
@PropertySource:用于加载.properties 文件中的配置
@Import:用于导入其他配置类

一、自定义bean扫描与纯注解开发

使用注解进行开发时,需要在核心配置文件中配置组件扫描,作用是指定哪个包及其子包下的Bean需要进行扫描以便识别使用注解配置的类、字段和方法。
也就是告诉Spring在这些包下面使用了注解,运行的时候需要扫描

<context:component-scan base-package="包路径"></context:component-scan>

这时候创建容器还是使用
ApplicationContext ctx = new ClasspathXmlApplicationcontext("xml文件名");

1.1 代替 Bean 标签的注解

Bean标签的基本属性

id:Bean实例在Spring容器中的唯一标识;
class:配置Bean的全包名(全限定名);
scope:配置对象的作用范围;
init-method:指定类中的初始化方法名称;
destroy-method:指定类中销毁方法名称。

1.1.1 @Component代替id和class属性

在xml中将一个类交给Spring容器管理的配置是这样的:

//在xml中将一个类交给Spring容器管理的配置
<bean id="userDao" class="com.sys.dao.impl.UserDaoImpl"></bean>

//使用@Component注解后是这样的(直接在对应类上面加上@Component即可)
@Component("userDao")
public class UserDaoImpl implements UserDao {}

注意:

  1. 对于@Controller、@Service、@Repository三个注解,他们的作用与@Component注解是一致的,只是一个语义化的表达,体现出我们的三层架构(即@Controller对应controller层的类、@Service对应service层的类、@Repository对应dao层的类)
  2. 如果注释没有命名,方法遵循驼峰命名法,则容器名称默认首字母小写的方法名,如果不遵循驼峰命名法,则容器名同方法名一致

1.2 实现纯注解开发

  • Spring3.0开启了纯注解开发模式,使用Java类代替配置文件。
  • 读取Spring核心配置文件初始化容器对象切换为读取Java配置类初始化容器对象
//加载配置文件初始化容器
ApplicationContext ctx = new ClasspathXmlApplicationcontext("xml文件名")
//加载配置类初始化容器
ApplicatinoContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);

1.2.1 @Configuration

@Configuration注解,表明该类是一个Spring的核心配置文件,以代替applicationContext.xml。

@Configuration      //标志该类为Spring的核心配置类
public class SpringConfig {
}

1.2.2 @ComponentScan

@ComponentScan代替context:component-scan配置包扫描

//xml中配置包扫描
<context:component-scan base-package="com.wang"></context:component-scan>

//配置类中配置包扫描
@Configuration      //标志该类为Spring的核心配置类
@ComponentScan("com.sys")
public class SpringConfig {
}

二、Bean管理

2.1 @Scope

@Scope注解代替scope属性标注Bean的范围

//xml中配置包扫描
<bean id="userDao" class="com.sys.dao.impl.UserDaoImpl" scope="prototype"></bean>

//配置类中配置包扫描
@Component("userDao")
@Scope("prototype")
public class UserDaoImpl implements UserDao {}

2.2@PostConstruct、@PreDestroy

@PostConstruct、@PreDestroy注解代替init-method、destroy-method属性配置

//xml中配置包扫描
<bean id="user" class="com.wang.pojo.User" init-method="start" destroy-method="end"></bean>


//配置类中配置包扫描
 @PostConstruct
    public void start(){
        System.out.println("初始化方法");
    }

    @PreDestroy
    public void end(){
        System.out.println("销毁方法");
    }

三、依赖注入

3.1 @Value代替property普通属性注入

//xml中配置包扫描
 <bean id="user" class="com.sys.pojo.User">
        <property name="username" value="test"/>
        <property name="password" value="testPassword"/>
    </bean>

//配置类中配置包扫描
@Component("user")
public class User {
    private Integer id;
    @Value("test")
    private String username;
    @Value("testPassword")
    private String password;
}

3.2 @Autowired自动装配

@Autowired、@Qualifier、@Resource代替字标签 property的依赖注入
@Resource注解相当于@Autowired+@Qualifier注解,按照名称进行注入。

//xml中配置包扫描
<bean id="userService" class="com.sys.service.impl.UserServiceImpl">
        <property name="userDao" ref="userDao"></property>
    </bean>

//配置类中配置包扫描
@Component("user")
public class User {

@Autowired
@Qualifier("userDao")
private UserDao userDao;
}

3.2.1 小结

  1. @Autowired
    @Autowired是按类型自动转配的,不支持id匹配。
    需要导入 spring-aop的包!
    @Autowired(required=false) 说明:false,对象可以为null;true,对象必须存对象,不能为null。如果允许对象为null,设置required = false,默认为true

  2. @Qualifier
    @Autowired是根据类型自动装配的,加上@Qualifier则可以根据byName的方式自动装配
    @Qualifier不能单独使用。

  3. @Resource
    @Resource如有指定的name属性,先按该属性进行byName方式查找装配;
    其次再进行默认的byName方式进行装配;
    如果以上都不成功,则按byType的方式自动装配。
    都不成功,则报异常。

3.2.2 @Autowired与@Resource异同

1、@Autowired与@Resource都可以用来装配bean。都可以写在字段上,或写在setter方法上。
2、@Autowired默认按类型装配(属于spring规范),默认情况下必须要求依赖对象必须存在,如果要允许null 值,可以设置它的required属性为false,如:@Autowired(required=false) ,如果我们想使用名称装配可以结合@Qualifier注解进行使用
3、@Resource(属于J2EE复返),默认按照名称进行装配,名称可以通过name属性进行指定。如果没有指定name属性,当注解写在字段上时,默认取字段名进行按照名称查找,如果注解写在setter方法上默认取属性名进行装配。当找不到与名称匹配的bean时才按照类型进行装配。但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配。
它们的作用相同都是用注解方式注入对象,但执行顺序不同。@Autowired先byType,@Resource先byName。

3.3 @PropertySource

@PropertySource代替context:property-placeholder加载外部properties配置文件

//xml中配置包扫描
<context:property-placeholder location="jdbc.properties"/>

//配置类中配置包扫描
@Configuration      //标志该类为Spring的核心配置类
@ComponentScan("com.sys")
PropertySource("jdbc.properties")
public class SpringConfig {
}

四、管理第三方Bean

4.1 @Bean代替非自定义的Bean的配置

xml中配置数据源如下:

 <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/test?useUnicode=true&amp;characterEncoding=utf-8&amp;serverTimezone=Asia/Shanghai"/>
        <property name="username" value="root"/>
        <property name="password" value="123456"/>
    </bean>

配置文件中配置数据源:

@Configuration      //标志该类为Spring的核心配置类
@ComponentScan("com.sys")
@Import(SpirngConfig.class)   //导入合并其他配置类,类似于配置文件中的 inculde 标签
public class SpringConfig {

    @Bean("dataSource")
    public DataSource getDataSource(){
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai");
        dataSource.setUsername("root");
        dataSource.setPassword("123456");
        return dataSource;
    }
}

五、 典型案例

5.1 整合mybatis

  • Mybatis核心对象分析
    43c55234d4d5185a218e19fce9108f5.png
  • 回顾看一下mybatis核心配置文件组成:
    364e2ac4e4ef10c3433b84a6d4f8530.png
  1. 需要SqlSessionFactory交给容器管理(SqlSessionFactory需要第三方bean中的mybatis通过dataSource连接池来获得)
  2. 导入相关pom依赖spring-jdbc、mybatis、mybatis-spring、druid、mysql-connector-java
  3. 创建JdbcConfig配置类,利用@Value注入dataSource相关值,利用@Bean来管理创建DataSource
  4. 创建MybatisConfig配置类,利用@Bean来管理创建sqlSessionFactoryBean(方法参数直接写dataSource,容器会自动寻找注入使用)
LICENSED UNDER CC BY-NC-SA 4.0
Comment