注解式开发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;
	}
}
相关推荐
职略2 小时前
负载均衡类型和算法解析
java·运维·分布式·算法·负载均衡
A22742 小时前
LeetCode 196, 73, 105
java·算法·leetcode
容若只如初见3 小时前
项目实战--Spring Boot + Minio文件切片上传下载
java·spring boot·后端
阿里巴巴P8资深技术专家3 小时前
Java常用算法&集合扩容机制分析
java·数据结构·算法
weixin_440401693 小时前
分布式锁——基于Redis分布式锁
java·数据库·spring boot·redis·分布式
码农爱java3 小时前
Spring Boot 中的监视器是什么?有什么作用?
java·spring boot·后端·面试·monitor·监视器
zengson_g3 小时前
当需要对大量数据进行排序操作时,怎样优化内存使用和性能?
java·数据库·算法·排序算法
血战灬狂龙4 小时前
pom.xml文件加载后没有变成maven图标
xml·java·maven
Apifox.4 小时前
什么是 HTTP POST 请求?初学者指南与示范
后端·http·学习方法·web
无名指的等待7124 小时前
SpringBoot实现图片添加水印(完整)
java·spring boot·后端