spring框架第二章之IoC容器与DI(全注解开发)
注解开发的好处
根据第一章所写的关于xml进行开发,有些小伙伴可能觉得很麻烦,因为要记住很多标签,和标签内的很多属性。
确实,在最开始学习的时候是会觉得xml配置要去记很多标签和属性,所以spring也支持另一种配置方式,使用注解去代替xml配置文件。这样也是极大地简便了配置。开发过程中就不用一直去xml里面更改配置了,只要一个注解就能解决所有问题。
spring注解介绍
spring老注解
注解 | 介绍 |
---|---|
@Component | 使用在类上用于实例化Bean |
@Controller | 使用在web层类上用于实例化Bean |
@Service | 使用在service上用于实例化Bean |
@Repository | 使用在dao上用于实例化Bean |
@Autowired | 使用在字段上用于根据类型依赖注入 |
@Qualifier | 结合@Autowired一起使用用于根据名称进行依赖注入 |
@Resource | 相当于@Autowired+@Qualifier,按照名称进行注入 |
@Value | 注入普通属性 |
@Scope | 标注Bean的作用范围(多例或单例) |
@PostConstruct | 使用在方法上标注该方法是Bean的初始化方法 |
@PreDestroy | 使用在方法上标注该方法是Bean的销毁方法 |
spring新注解
注解 | 介绍 |
---|---|
@Configuration | 用于指定当前类是一个 Spring 配置类,当创建容器时会从该类上加载注解 |
@ComponentScan | 用于指定 Spring 在初始化容器时要扫描的包,作用和在 Spring 的 xml 配置文件中的<context:component-scan base-package=“com.dyh”/>一样 |
@Bean | 使用在方法上,标注将该方法的返回值存储到 Spring 容器中 |
@PropertySource | 用于加载.properties 文件中的配置 |
@Import | 用于导入其他配置类 |
代码示例
和xml配置开发不同的是,全注解开发没有applicationContext配置文件了,所有的配置信息全部被注解所代替。
包结构
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>javaee</groupId>
<artifactId>day01_spring</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<!--spring-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
</dependencies>
</project>
AccountDao接口
package com.dyh.dao;
public interface AccountDao {
/**
* 保存账户
*/
void saveAccount();
}
AccountDaoImpl实现类
package com.dyh.dao.impl;
import com.dyh.dao.AccountDao;
import org.springframework.stereotype.Repository;
@Repository("accountDao") //将AccountDaoImpl交给spring管理
public class AccountDaoImpl implements AccountDao {
/**
* 保存账户
*/
@Override
public void saveAccount() {
System.out.println("模拟保存账户信息");
}
}
AccountService接口
package com.dyh.service;
/**
* AccountService业务层接口
*/
public interface AccountService {
/**
* 保存账户
*/
void saveAccount();
}
AccountServiceImpl实现类
package com.dyh.service.impl;
import com.dyh.dao.AccountDao;
import com.dyh.service.AccountService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service("accountService")
public class AccountServiceImpl implements AccountService {
@Autowired //在这里不但按类型注入,同时也指定名字,当有多个类型相同的对象时,必须要指定对象id
//@Qualifier("accountDao")
private AccountDao accountDao;
/**
* 保存账户
*/
@Override
public void saveAccount() {
System.out.println("我是AccountService层");
// 调用AccountDao的saveAccount()方法
accountDao.saveAccount();
}
}
SpringConfig配置类
package com.dyh.config;
import com.dyh.dao.AccountDao;
import com.dyh.dao.impl.AccountDaoImpl;
import org.springframework.context.annotation.*;
/**
* spring的配置类
*/
@Configuration //声明这是一个配置类
@ComponentScan("com.dyh") //开启注解扫描
//@Import() //用于导入其他的配置类
//@PropertySource() //用于导入properties文件
public class SpringConfig {
@Bean //将此方法的返回值交给spring 管理,一般用于引入第三方jar包时使用,在这里做一个简单的演示
public AccountDao getAccountService(){
return new AccountDaoImpl();
}
}
TestDemo测试类
package com.dyh.controller;
import com.dyh.config.SpringConfig;
import com.dyh.service.AccountService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class TestDemo {
public static void main(String[] args) {
ApplicationContext app = new AnnotationConfigApplicationContext(SpringConfig.class);
//在这里使用的是用另一个解析配置类的方法去new出来app对象
AccountService accountService = app.getBean(AccountService.class);
accountService.saveAccount();
}
}
运行结果
总结
可以发现相比上一次使用纯xml配置文件去开发,这次更加简单,省去了不少的标签配置,只要稍加练习,就可以掌握每个注解的用途。同时也不是要么全注解,要么全配置,大部分使用的是半注解半配置的方式去开发。下一篇将简单讲解半注解半xml配置的方式进行开发。