本文已参与「新人创作礼」活动, 一起开启掘金创作之路
通过进行注解开发可以有效提高开发效率, 减少对繁杂配置文件的配置
先通过配置文件进行举例, 后面将通过注解进行逐步替代, 在一个配置好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();
}
}
测试的结果