Spring学习笔记(七)Spring注解开发

149 阅读2分钟

本文已参与「新人创作礼」活动, 一起开启掘金创作之路

通过进行注解开发可以有效提高开发效率, 减少对繁杂配置文件的配置

先通过配置文件进行举例, 后面将通过注解进行逐步替代, 在一个配置好spring的maven工程上进行开发

完善测试环境的操作

在Java文件夹下创建dao, service, web文件夹 dao文件夹先分别有UserDao接口和UserDaoImpl实现类 service文件夹下有UserService接口和UserService实现类 web文件夹有UserController文件,包含一个主函数, 用于测试程序

UserDao接口

package com.dao;

public interface UserDao {
    public void save();
}

UserDaoImpl实现类

package com.dao.impl;
import com.dao.UserDao;

public class UserDaoImpl implements UserDao {

    public void save() {
        System.out.println("save running......");
    }
}

UserService接口

package com.service;

public interface UserService {
    public void save();
}

UserService实现类

package com.service.impl;
import com.dao.UserDao;
import com.service.UserService;

public class UserServiceImpl implements UserService {

    private UserDao userDao;

    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }

    public void save() {
        userDao.save();
    }
}

配置文件applicationContext.xml

	<bean id="userDao" class="com.dao.impl.UserDaoImpl"></bean>
    <bean id="userService" class="com.service.impl.UserServiceImpl">
        <property name="userDao" ref="userDao"></property>
    </bean>

测试

package com.web;
import com.service.UserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class UserController {

    public static void main(String[] args) {
        ApplicationContext app=new ClassPathXmlApplicationContext("applicationContext.xml");
        UserService userService = app.getBean(UserService.class);
        userService.save();
    }
}

测试结果 在这里插入图片描述

原始注解入门

下面通过注解的方式对xml配置文件进行替代

注解主要加在实现类中

UserDaoImpl: 用@Component("userDao")替代 <bean id="userDao" class="com.dao.impl.UserDaoImpl"></bean>

package com.dao.impl;

import com.dao.UserDao;
import org.springframework.stereotype.Component;

//<bean id="userDao" class="com.dao.impl.UserDaoImpl"></bean>
@Component("userDao")
public class UserDaoImpl implements UserDao {

    public void save() {
        System.out.println("save running......");
    }
}

UserServiceImpl: @Component("userService")替代 <bean id="userService" class="com.service.impl.UserServiceImpl"><bean>

@Autowired和@Qualifier("userDao")替代 <property name="userDao" ref="userDao"></property>

//<bean id="userService" class="com.service.impl.UserServiceImpl"><bean>
@Component("userService")
public class UserServiceImpl implements UserService {

    //<property name="userDao" ref="userDao"></property>
    @Autowired
    @Qualifier("userDao")

    private UserDao userDao;

    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }

    public void save() {
        userDao.save();
    }
}

使用注解进行开发时, 需要在applicationContext.xml中配置组件扫描, 作用是指定那个包及其子下包的Bean需要进行扫描以便识别使用注解配置的类, 字段和方法 配置基本包就行

<!--配置组件扫描-->
    <context:component-scan base-package="com"/>

在UserController进行测试 在这里插入图片描述 测试成功

原始注解详解

在这里插入图片描述

Spring 新注解

使用上面的注解不能全部替代xml配置文件, 还需要使用新注解替代的配置如下

非自定义的Bean配置: <bean> 加载properties文件的配置<context:property-placeholder> 组件扫码的配置<context:component-scan> 引入其他文件<import>

新注解 在这里插入图片描述 用一个核心配置的类来替代xml文件 SpringConfiguration

package com.config;

import org.springframework.context.annotation.*;

//标志该类是Spring的核心配置类
@Configuration

//<context:component-scan base-package="com"/>配置组件扫描
@ComponentScan("com")

@Import(DataSourceConfiguration.class)
public class SpringConfiguration {

}

分注解文件

package com.config;

import com.mchange.v2.c3p0.ComboPooledDataSource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.PropertySource;

import javax.sql.DataSource;
import java.beans.PropertyVetoException;

//<context:property-placeholder location="classpath:jdbc.properties"/>加载外部的properties文件
@PropertySource("classpath:jdbc.properties")
public class DataSourceConfiguration {
    @Value("${jdbc.driver}")
    private String driver;
    @Value("${jdbc.url}")
    private String url;
    @Value("${jdbc.username}")
    private String username;
    @Value("${jdbc.password}")
    private String password;

    @Bean("dataSource")//Spring会将当前方法的返回值以指定名称存储到Spring容器中
    public DataSource getDataSource() throws PropertyVetoException {
        ComboPooledDataSource dataSource = new ComboPooledDataSource();

        //设置基本的连接参数
        dataSource.setDriverClass(driver);
        dataSource.setJdbcUrl(url);
        dataSource.setUser(username);
        dataSource.setPassword(password);

        return dataSource;
    }

}

修改测试的程序

public class UserController {

    public static void main(String[] args) {
        //ApplicationContext app=new ClassPathXmlApplicationContext("applicationContext.xml");
        ApplicationContext app = new AnnotationConfigApplicationContext(SpringConfiguration.class);
        UserService userService = app.getBean(UserService.class);
        userService.save();
    }
}

测试的结果 在这里插入图片描述