注解式开发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;
	}
}
相关推荐
冻感糕人~1 分钟前
【珍藏必备】ReAct框架实战指南:从零开始构建AI智能体,让大模型学会思考与行动
java·前端·人工智能·react.js·大模型·就业·大模型学习
啦啦啦_99997 分钟前
Redis实例-2
java
alice--小文子12 分钟前
cursor-mcp工具使用
java·服务器·前端
进阶小白猿12 分钟前
Java技术八股学习Day33
java·开发语言·学习
程序员敲代码吗18 分钟前
如何通过命令行启动COMSOL的参数化、批处理和集群扫描
java·c#·bash
MX_935923 分钟前
Spring的bean工厂后处理器和Bean后处理器
java·后端·spring
市场部需要一个软件开发岗位40 分钟前
JAVA开发常见安全问题:纵向越权
java·数据库·安全
历程里程碑1 小时前
普通数组----合并区间
java·数据结构·python·算法·leetcode·职场和发展·tornado
程序员泠零澪回家种桔子1 小时前
Spring AI框架全方位详解
java·人工智能·后端·spring·ai·架构
CodeCaptain1 小时前
nacos-2.3.2-OEM与nacos3.1.x的差异分析
java·经验分享·nacos·springcloud