注解式开发Spring

引入

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

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

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

控制bean的声明周期

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

@Component("userDao")
puiblic class UserDao{
	@PostConstruct
	public void init(){}
	@PreDestroy
	public void destroy(){}
}

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

依赖注入

自定义类型

只需要在需要装配的属性前加上@Autowired
并且可以省略配置文件式开发使用的Setter方法

public class UserService{
	@Autowired
	private UserDao userDao
}

按类型自动装配:@Autowired
按名称自动装配:@Qualifier(“bean’s id”)

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

简单类型

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

@Repository("userDao")
public class UserDao{
	@Value("Zhangsan")
	private String name;
}

注入外部Properties

name=zhangsan

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

@Configuration
@ComponentScan("com.angelday")
@PropertySource("classpath:Xxx.properties")
public class SpringConfig{
}

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

@Repository("userDao")
public class UserDao{
	@Value(#{name})
	private String name;
}

管理外部bean

方式

  1. 添加一个配置类用来获取要管理的对象
    此处以添加Druid的数据源为例
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
@Configuration
@Improt(JdbcConfig.class)
public class SpringConfig{
}

优化

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

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. 注解开发Spring

    2024-05-01 15:28:02       34 阅读
  2. spring6】Spring IoC注解开发

    2024-05-01 15:28:02       159 阅读
  3. Spring注解开发

    2024-05-01 15:28:02       63 阅读
  4. Spring-注解开发

    2024-05-01 15:28:02       61 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-05-01 15:28:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-05-01 15:28:02       101 阅读
  3. 在Django里面运行非项目文件

    2024-05-01 15:28:02       82 阅读
  4. Python语言-面向对象

    2024-05-01 15:28:02       91 阅读

热门阅读

  1. mysql中的索引

    2024-05-01 15:28:02       33 阅读
  2. 数据库语法复习

    2024-05-01 15:28:02       31 阅读
  3. Redis:三种启动方式

    2024-05-01 15:28:02       30 阅读
  4. 虚拟机中new指令的秘密

    2024-05-01 15:28:02       40 阅读
  5. stm32mp135d u-boot 引导流程

    2024-05-01 15:28:02       34 阅读
  6. Python如何实现抽象工厂模式

    2024-05-01 15:28:02       34 阅读
  7. 每日算法之二叉树的层序遍历

    2024-05-01 15:28:02       34 阅读
  8. 【笔试题汇总】美团笔试题题解 第五场 2024.4.27

    2024-05-01 15:28:02       28 阅读
  9. openwrt提供的四个文件分别是干什么的

    2024-05-01 15:28:02       111 阅读
  10. 工具类,包含线程池,excel图片处理

    2024-05-01 15:28:02       38 阅读
  11. json.parse(json.stringify)的弊端

    2024-05-01 15:28:02       29 阅读
  12. Element-UI 快速入门

    2024-05-01 15:28:02       37 阅读
  13. 前端html中iframe的基本使用

    2024-05-01 15:28:02       32 阅读