注解式开发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;
	}
}
相关推荐
程序员小羊!4 分钟前
Java教程:JavaWeb ---MySQL高级
java·开发语言·mysql
白仑色11 分钟前
Spring Boot 多环境配置详解
java·spring boot·后端·微服务架构·配置管理
懒斌12 分钟前
linux驱动程序
后端
超级小忍14 分钟前
在 Spring Boot 中优化长轮询(Long Polling)连接频繁建立销毁问题
java·spring boot·后端
David爱编程17 分钟前
Java 中 Integer 为什么不是万能的 int 替代品?
java·后端
阿宝想会飞19 分钟前
easyExcel多出大量数据方法
后端
自由的疯19 分钟前
基于 Java POI 实现动态列 Excel 导出的通用方法
后端
老马啸西风19 分钟前
个人网站一键引入免费开关评论功能 giscus
java
自由的疯20 分钟前
Java 利用 Apache POI 实现多模板 Word 文档生成(补充:模板文档为复杂表单的处理办法)
后端
平平无奇的开发仔22 分钟前
# Java 序列化与 Jackson 序列化机制对比
后端