Spring注解开发
一、Spring注解概论
Spring是一个轻代码而重配置的框架,配置起来比较繁重,极大程度上影响开发效率,所以在很多情况下,注解配置比XML配置更加欢迎,Spring2.5引入了很多注解类,因此可以使用注解完成大部分的XML配置
二、Spring原始注解
1、引用数据
Spring原始注解主要的作用是用来替换< Bean >的配置
注解 | 说明 |
---|---|
@Component | 使用在类上用于实例化Bean |
@Controller | 使用在web层类上用于实例化Bean |
@Service | 使用在service层类上用于实例化Bean |
@Repository | 使用在dao层类上用于实例化Bean |
@Autowired | 使用在字段上用于根据类型依赖注入 |
@Qualifier | 结合@Autowired一起使用用于根据名称进行依赖注入 |
@Resource | 相当于@Autowired+@Qualifier,按照名称进行注入 |
@Value | 注入普通属性 |
@Scope | 标注Bean的作用范围 |
@PostConstruct | 使用在方法上标注该方法是Bean的初始化方法 |
@PreDestroy | 使用在方法上标注该方法是Bean的销毁方法 |
在表格中,前四个注解属于一类
在不清楚是属于哪一层的时候,可以用@Component,清楚是哪一层的话就使用对应的注解,这样可读性更好
public class test01 {
@Test
public void test1(){
ApplicationContext app = new ClassPathXmlApplicationContext("applicatonContext.xml");
UserServiceImpl userService = (UserServiceImpl) app.getBean("userService");
userService.save();
}
}
//Repository(dao层)相当于下面的xml配置
//<bean id="userDao" class="com.kang.dao.impl.UserImpl"></bean>
//相当于ID
@Repository("userDao")
public class UserImpl implements UserDao {
@Override
public void save() {
System.out.println("save running 。。 。。。");
}
}
/**
* <bean id="userService" class="com.kang.service.impl.UserServiceImpl">
* <property name="userDao" ref="userDao"></property>
* </bean>
*/
//相当于<bean id="userService" class="com.kang.service.impl.UserServiceImpl">
//相当于ID
@Service("userService")
public class UserServiceImpl implements UserService {
//相当于<property name="userDao" ref="userDao"></property>
//@Autowired //按照数据类型从spring容器中进行配置,倘如只有一个这种数据类型,那么则不需要写下面的注解
//@Qualifier("userDao") //根据id值从容器中进行匹配,但是主要此处@Qualifier和@Autowired一起使用
@Resource(name = "userDao") //@Resource相当于@Qualifier+@Autowired
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.kang"></context:component-scan>
2、普通数据
普通数据例如int、String的数据的注入可以使用@Value进行注入
/**
* <bean id="userService" class="com.kang.service.impl.UserServiceImpl">
* <property name="userDao" ref="userDao"></property>
* </bean>
*/
//相当于<bean id="userService" class="com.kang.service.impl.UserServiceImpl">
//相当于ID
@Service("userService")
public class UserServiceImpl implements UserService {
//相当于<property name="userDao" ref="userDao"></property>
//@Autowired //按照数据类型从spring容器中进行配置,倘如只有一个这种数据类型,那么则不需要写下面的注解
//@Qualifier("userDao") //根据id值从容器中进行匹配,但是主要此处@Qualifier和@Autowired一起使用
@Resource(name = "userDao") //@Resource相当于@Qualifier+@Autowired
private UserDao userDao;
//普通数据的注入
@Value("www.baidu.com")
private String url;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public void save(){
userDao.save();
System.out.println(url);
}
}
但是像这种用法一般很少,通过是在使用EL表达式,这样可以解耦,不至于在代码中写死了某一个字符串,便于系统的维护
若要使用EL表达式,首先先在xml文件中加载properties文件,接着@Value结合EL表达式
@Value("${key}")
/**
* <bean id="userService" class="com.kang.service.impl.UserServiceImpl">
* <property name="userDao" ref="userDao"></property>
* </bean>
*/
//相当于<bean id="userService" class="com.kang.service.impl.UserServiceImpl">
//相当于ID
@Service("userService")
public class UserServiceImpl implements UserService {
//相当于<property name="userDao" ref="userDao"></property>
//@Autowired //按照数据类型从spring容器中进行配置,倘如只有一个这种数据类型,那么则不需要写下面的注解
//@Qualifier("userDao") //根据id值从容器中进行匹配,但是主要此处@Qualifier和@Autowired一起使用
@Resource(name = "userDao") //@Resource相当于@Qualifier+@Autowired
private UserDao userDao;
//普通数据的注入(结合EL表达式)
@Value("${jdbc.url}")
private String url;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public void save(){
userDao.save();
System.out.println(url);
}
}
3、标注初始化以及销毁方法
@Service("userService")
public class UserServiceImpl implements UserService {
//相当于<property name="userDao" ref="userDao"></property>
//@Autowired //按照数据类型从spring容器中进行配置,倘如只有一个这种数据类型,那么则不需要写下面的注解
//@Qualifier("userDao") //根据id值从容器中进行匹配,但是主要此处@Qualifier和@Autowired一起使用
@Resource(name = "userDao") //@Resource相当于@Qualifier+@Autowired
private UserDao userDao;
//普通数据的注入
@Value("${jdbc.url}")
private String url;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public void save(){
userDao.save();
System.out.println(url);
}
//标注初始化方法
@PostConstruct
public void init(){
System.out.println("初始化。。。。。");
}
//标注销毁方法
@PreDestroy
public void destroy(){
System.out.println("销毁。。。。.");
}
}
三、 Spring新注解
Spring原始注解不能替代全部的xml配置文件,还需要使用spring新注解来解决以下的配置:
- 非程序猿自个定义的Bean的配置:< bean >
- 加载properties文件的配置:<context:property-placeholder location=“jdbc.properties”/>
- 组件扫描的配置:<context:component-scan base-package=“com.kang”></context:component-scan >
- 引入其他文件:< import >
注解 | 说明 |
---|---|
@Configuration | 用于指定当前类是一个 Spring 配置类,当创建容器时会从该类上加载注解 |
@ComponentScan | 用于指定 Spring 在初始化容器时要扫描的包。 作用和在 Spring 的 xml 配置文件中的<context:component-scan base-package=“com.kang”></ context:component-scan >作用一样 |
@Bean | 使用在方法上,标注将该方法的返回值存储到 Spring 容器中 |
@PropertySource | 用于加载.properties 文件中的配置 |
@Import | 用于导入其他配置类 |
1、新注解使用方法
- 创建一个springConfiguration类,使用@Configuration表示,标明这个类是一个Spring配置类
- 不建议将所有配置都写在一个主配置文件,所以还可以用import
@Configuration //标注为主配置文件
@ComponentScan("com.kang") //扫描
@Import(DataSourceConfiguration.class) //导入外部配置文件
public class SpringConfiguration {
}
@PropertySource("jdbc.properties") //导入properties配置文件
public class DataSourceConfiguration {
@Value("${jdbc.driver}")
private String driver;
@Value("${jdbc.url}")
private String url;
@Value("${jdbc.username}")
private String user;
@Value("${jdbc.password}")
private String password;
@Bean(name = "dataSource") //标注将该方法的返回值存储到 Spring 容器中
public DataSource getDataSource() throws Exception {
//创建数据源
ComboPooledDataSource dataSource = new ComboPooledDataSource();
//设置数据库连接参数
dataSource.setDriverClass(driver);
dataSource.setJdbcUrl(url);
dataSource.setUser(user);
dataSource.setPassword(password);
return dataSource;
}
}
@Test
public void test2() throws SQLException {
ApplicationContext app = new AnnotationConfigApplicationContext(SpringConfiguration.class);
UserServiceImpl userService = (UserServiceImpl) app.getBean("userService");
userService.save();
DataSource dataSource = (DataSource) app.getBean("dataSource");
Connection connection = dataSource.getConnection();
System.out.println(connection);
}
rviceImpl userService = (UserServiceImpl) app.getBean(“userService”);
userService.save();
DataSource dataSource = (DataSource) app.getBean(“dataSource”);
Connection connection = dataSource.getConnection();
System.out.println(connection);
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/95021.html