注解式开发Spring

引入

上一篇我们在声明一个被Spring容器管理的Bean时,在XML中

xml 复制代码
<bean id="userDao" class="com.angelday.dao.UserDao">
  1. 我们使用注解开发时,只需要在想要声明Bean的类中添加一个注解@Compnent()并且在括号里添加这个Bean的id
java 复制代码
@Component("id")
puiblic class UserDao{
	public void save(){
		System.out.println("userDao-->run!");
	}
}
  1. 这样我们只能够声明这是一个被管理的bean,但是Spring容器并不能直接识别到它,所以我们需要创建一个类,来告诉Spring要去哪里找bean 我们在根目录下创建一个新的包:config,用来存放配置类
java 复制代码
//这个注解用来声明这是一个Spring的配置类
@Configuration
//这个注解用来告诉Spring需要去哪里扫描bean
@ComponentScan("com.angelday")
public class SpringConfig{
}
  1. 测试,初始化容器与以前不一致
java 复制代码
public class Test{
	public static void main(){
		//获取IoC容器,并且传入配置类
		ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
		//获取Bean,使用getBean("id");方法
		UserDao userDao = (UserDao)ctx.getBean("userDao");
		userDao.save();
	}
}

与传统开发对比

注解只是代替了以前的内容

  • 原先xml配置文件被SpringConfig类代替
  • xml格式写为类中的@Configuration注解
  • < bean>标签被@Component代替
  • id属性写在@Component("id")中
  • class属性写到配置类的@ComponentScan("com.angelday")
  • 获取IoC容器的对象ClassPatjXmlApplicationContext换为AnnotationConfigApplicationContext

注意:Spring提供了@Component注解的三个衍生注解

注解 说明
@Controller 表现层bean定义
@Service 业务层bean定义
@Repository 数据层bean定义

管理Bean

控制bean为非单例对象

在类前加上@Scope注解

java 复制代码
@Component("userDao")
@Scope("prototype")
puiblic class UserDao{
	public void save(){
		System.out.println("userDao-->run!");
	}
}

控制bean的声明周期

在类中添加方法,分别管理不同的声明时期,并且为这些方法添加注解

java 复制代码
@Component("userDao")
puiblic class UserDao{
	@PostConstruct
	public void init(){}
	@PreDestroy
	public void destroy(){}
}

根据翻译不难看出,第一个在构造方法执行后,第二个在销毁前

依赖注入

自定义类型

只需要在需要装配的属性前加上@Autowired

并且可以省略配置文件式开发使用的Setter方法

java 复制代码
public class UserService{
	@Autowired
	private UserDao userDao
}

按类型自动装配:@Autowired

按名称自动装配:@Qualifier("bean's id")

注意:@Qualifier必须配合@Autowired注解使用

简单类型

在属性上直接使用@Value()注解

java 复制代码
@Repository("userDao")
public class UserDao{
	@Value("Zhangsan")
	private String name;
}

注入外部Properties

priperties 复制代码
name=zhangsan

在Spring配置类中添加@PropertySource()注解

java 复制代码
@Configuration
@ComponentScan("com.angelday")
@PropertySource("classpath:Xxx.properties")
public class SpringConfig{
}

在需要注入的属性前添加@Value()注解

java 复制代码
@Repository("userDao")
public class UserDao{
	@Value(#{name})
	private String name;
}

管理外部bean

方式

  1. 添加一个配置类用来获取要管理的对象
    此处以添加Druid的数据源为例
java 复制代码
public class JdbcConfig{
	//@Bean表示当前方法返回值是一个bean
	@Bean
	public DataSource dataSource(){
		DruidDataSource dds = new DruidDataSource();
		ds.setDriverClassName("com.mysql.jdbc.Driver");
		ds.setUrl("jdbc:mysql://localhost:3306/db_name");
		ds.setUsername("root");
		ds.setPassword("123456");

		return dds;
	}
}
  1. 在SpringConfig配置类中导入这个配置类
    使用@Import
java 复制代码
@Configuration
@Improt(JdbcConfig.class)
public class SpringConfig{
}

优化

上面简单类型数据不应该写在类里,所以可以使用@Value的方式注入简单数据类型

java 复制代码
public class JdbcConfig{
	@Value("com.mysql.jdbc.Driver")
	private String driver;
	@Value("jdbc:mysql://localhost:3306/db_name")
	private String url;
	@Value("root")
	private String userName;
	@Value("123456")
	private String password;

	@Bean
	public DataSource dataSource(){
		DruidDataSource dds = new DruidDataSource();
		ds.setDriverClassName(driver);
		ds.setUrl(url);
		ds.setUsername(userName);
		ds.setPassword(password);
		return dds;
	}
}
相关推荐
Wang's Blog9 小时前
Java 中间件之 RabbitMQ 快速入门: MQ 常见技术选型对比
java·中间件·java-rabbitmq
蜗牛互联网9 小时前
Java Agent 工具调用的 allowlist、参数校验与调用预算
java·开发语言·人工智能·后端·oracle
用户813267933259 小时前
行情数据晚到几秒,会让量化策略失去优势吗?从信号时间到回测偏差
后端·github·api
大文说跨境9 小时前
多账号环境隔离方案技术选型:指纹浏览器、VPS 与云手机的三种架构对比
java·开发语言·前端
九零HTTP9 小时前
一次 TCP 连接的一生:从三次握手到四次挥手
后端
ZOnePieceC9 小时前
消息队列之Kafka
后端
yunwei379 小时前
eBPF 入门实践教程十七:编写 eBPF 程序统计随机/顺序磁盘 I/O
linux·后端·性能优化
花间相见9 小时前
【计算基础|网络07】HTTPS(下):ECDHE 握手与优化
后端
QuantiCore_IO9 小时前
从请求风暴到可维护的数据管道:量化系统为什么需要批量接口?
后端·github·api
136096757239 小时前
.env 的三个必查项
后端