上面是与生命周期有关的内容,下面是属性赋值相关的:

@Configuration
public class ProperTyValueConfig { @Bean
public Person person() {
return new Person();
}
}

测试:

public class test {

    private void printBeans(AnnotationConfigApplicationContext applicationContext) {
String[] beanDefinitionNames = applicationContext.getBeanDefinitionNames();
for(String name : beanDefinitionNames) {
System.out.println(name);
}
Object p = applicationContext.getBean("person");
System.out.println(p);
} @Test
public void test01(){
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(ProperTyValueConfig.class);
System.out.println("容器创建完成");
printBeans(applicationContext);
//关闭容器
applicationContext.close();
} }

看看容器有哪些Bean

除了容器自带的,还有就是我们配置的person,还没有赋值哦

xml:

<baen  id = "person"  class = "com.toov5.Person">

<property name = "age" value= 12> </property>

<property name="name" value = "jack"> </property>

</bean>

注解:

@Value()   boolean

Spel  基本数值都可以写 #{}

${} 取出配置文件中的值  在运行环境中的变量值

Bean类及其赋值:

package com.toov5.Bean;

import org.springframework.beans.factory.annotation.Value;

public class Person {

 @Value("#{20-1}")
int age; @Value("MaYun")
String name; public Person() {
// TODO Auto-generated constructor stub
} public Person(int age, String name) {
super();
this.age = age;
this.name = name;
} @Override
public String toString() {
return "Person [age=" + age + ", name=" + name + "]";
} }

注意赋值 @Value 类型要匹配

下面介绍使用properties文件的:

如果用xml形式的读取:

xml中需要有命名空间:  <context: property-placeholder location=“xxxxxx/xxx” />    用其导入外部的配置文件

如果用注解的方式读取:

config:

@Configuration
@PropertySource(value= {"classpath"/person.properties"})
public class ProperTyValueConfig { @Bean
public Person person() {
return new Person();
}
}

Bean类:

public class Person {

 @Value("#{20-1}")
int age; @Value("MaYun")
String name; @Value("${person.addr}")
String addr; public Person() {
// TODO Auto-generated constructor stub
} public Person(int age, String name) {
super();
this.age = age;
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getAddr() {
return addr;
} public void setAddr(String addr) {
this.addr = addr;
} @Override
public String toString() {
return "Person [age=" + age + ", name=" + name + ", addr=" + addr + "]";
} }

properties:

person.addr=beijing

测试:

public class test {

    private void printBeans(AnnotationConfigApplicationContext applicationContext) {
String[] beanDefinitionNames = applicationContext.getBeanDefinitionNames();
for(String name : beanDefinitionNames) {
System.out.println(name);
}
Object p = applicationContext.getBean("person");
System.out.println(p);
} @Test
public void test01(){
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(ProperTyValueConfig.class);
System.out.println("容器创建完成");
printBeans(applicationContext);
//关闭容器
applicationContext.close();
} }

一旦properties文件被加载,还可以使用如下方式获取:

public class test {

    private void printBeans(AnnotationConfigApplicationContext applicationContext) {
String[] beanDefinitionNames = applicationContext.getBeanDefinitionNames();
for(String name : beanDefinitionNames) {
System.out.println(name);
}
Object p = applicationContext.getBean("person");
System.out.println(p);
//运行时环境变量
ConfigurableEnvironment environment = applicationContext.getEnvironment();
String property = environment.getProperty("person.addr");
System.out.println(property); } @Test
public void test01(){
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(ProperTyValueConfig.class);
System.out.println("容器创建完成");
printBeans(applicationContext);
//关闭容器
applicationContext.close();
} }

自动装配:

Spring 利用依赖注入(DI),完成IOC容器中格个组件的依赖关系赋值

Service

@Service
public class BookService { @Autowired
private BookDao bookDao; public void print() {
System.out.println(bookDao);
}
@Override
public String toString() {
return "BookService"+bookDao;
}
}

config:

@Configuration
@ComponentScan({"com.toov5.dao","com.toov5.service","com.toov5.controller"})
public class ProperTyValueConfig { }

test:

public class test {

    @Test
public void test01(){
AnnotationConfigApplicationContext applicationContext =new AnnotationConfigApplicationContext(ProperTyValueConfig.class);
BookService bookService =(BookService) applicationContext.getBean(BookService.class); //按照类型去拿
System.out.println(bookService);
applicationContext.close();
} }

有了dao哦

其实就是容器中的到哦:

@Autowired 自动注入

默认优先按照类型去容器找对应的组件:  applicationContext.getBean(BookService.class);

找到则赋值

如果这个类型的组件在IOC中有多个,怎么处理?

容器中有两个类型相同 名字不同的bean

如果找到多个相同类型的组件,再将属性名作为组件的id 去容器中查找。applicationContext.getBean("bookDao")

在装配时候:

名字是bookDao2

@Service
public class BookService { @Autowired
private BookDao bookDao2; public void print() {
System.out.println(bookDao2);
}
@Override
public String toString() {
return "BookService"+bookDao2.getFlag();
}
}

config注入的是 bookDao2

@Configuration
@ComponentScan({"com.toov5.dao","com.toov5.service","com.toov5.controller"})
public class ProperTyValueConfig { @Bean(name="bookDao2")
public BookDao bookDao() {
BookDao bookDao = new BookDao();
bookDao.setFlag("2");
return bookDao;
}
}

测试:

public class test {

    @Test
public void test01(){
AnnotationConfigApplicationContext applicationContext =new AnnotationConfigApplicationContext(ProperTyValueConfig.class);
BookService bookService =(BookService) applicationContext.getBean(BookService.class); //按照类型去拿
System.out.println(bookService); BookDao bookDao = applicationContext.getBean(BookDao.class);
System.out.println(bookDao.getFlag()); applicationContext.close();
}
}

可以在装配时候这么玩儿

@Qualifier("bookDao")   指定需要抓给你配的组件的id 而不是属性名

@Service
public class BookService { @Qualifier("bookDao")
@Autowired
private BookDao bookDao2; public void print() {
System.out.println(bookDao2);
}
@Override
public String toString() {
return "BookService"+bookDao2.getFlag();
}
}

打印:

自动装配默认一定要将属性赋值好,没有就会报错

如果:

@Service
public class BookService { @Qualifier("bookDao")
@Autowired(required=false)
private BookDao bookDao2; public void print() {
System.out.println(bookDao2);
}
@Override
public String toString() {
return "BookService"+bookDao2.getFlag();
}
}

如果没有的情况下,不报错:

@Service
public class BookService { @Qualifier("bookDao666")
@Autowired(required=false)
private BookDao bookDao2; public void print() {
System.out.println(bookDao2);
}
}

测试:

public class test {

    @Test
public void test01(){
AnnotationConfigApplicationContext applicationContext =new AnnotationConfigApplicationContext(ProperTyValueConfig.class);
BookService bookService =(BookService) applicationContext.getBean(BookService.class); //按照类型去拿
bookService.print(); applicationContext.close();
}
}

打印:

容器中没有的情况 会null

还有一个spring的牛逼的注解 @Primary  让spring自动装配的时候 默认使用首选bean

@Configuration
@ComponentScan({"com.toov5.dao","com.toov5.service","com.toov5.controller"})
public class ProperTyValueConfig { @Primary
@Bean(name="bookDao2")
public BookDao bookDao() {
BookDao bookDao = new BookDao();
bookDao.setFlag("2");
return bookDao;
}
}

每次首选装配的是加了 @Primary的

既然已经在容器中声明了 在装配时候 @Qualifier 就不需要了

使用首选来装配

如果加了@Qualifier 那就是明确指定的了

service:

@Service
public class BookService { @Autowired(required=false)
private BookDao bookDao; public void print() {
System.out.println(bookDao.getFlag());
}
}

config 明确了优先装配的bean

@Configuration
@ComponentScan({"com.toov5.dao","com.toov5.service","com.toov5.controller"})
public class ProperTyValueConfig { @Primary
@Bean(name="bookDao2")
public BookDao bookDao() {
BookDao bookDao = new BookDao();
bookDao.setFlag("2");
return bookDao;
}
}

测试:

public class test {

    @Test
public void test01(){
AnnotationConfigApplicationContext applicationContext =new AnnotationConfigApplicationContext(ProperTyValueConfig.class);
BookService bookService =(BookService) applicationContext.getBean(BookService.class); //按照类型去拿
bookService.print(); applicationContext.close();
}
}

Spring还支持使用 @Resource(JSR250) java 规范的注释   @Qualifier+ @Autowired = @Resource 或者 @Resource(name="bookDao2") 否则就默认当前的属性名字

和 @Inject(JSP330)  需要额外导入依赖 (maven仓库搜索inject)  Autowried可以设置required属性

@Autowried构造器  参数 方法 属性 都可以标注使用

CarBean:

@Component
public class Car {
public Car() {
System.out.println("无参构造初始化");
}
public void init() {
System.out.println("CarBean---init");
}
public void destory() {
System.out.println("CarBean---destory");
}
}

BossBean:  默认加载IOC容器中的组件,容器会调用无参构造器创建对象,在进行初始化赋值等操作。

@Component
public class Boss { private Car car; public Car getCar() {
return car;
}
@Autowired //标注在方法上 spring容器创建对象时候 调用方法 完成赋值。方法使用的参数,自定义类型的值 从IOC获取值
public void setCar(Car car) {
this.car = car;
}
}

config:

@Configuration
@ComponentScan({"com.toov5.Bean"})
public class ProperTyValueConfig { @Primary
@Bean(name="bookDao2")
public BookDao bookDao() {
BookDao bookDao = new BookDao();
bookDao.setFlag("2");
return bookDao;
}
}

测试:

public class test {
@Test
public void test01(){
AnnotationConfigApplicationContext applicationContext =new AnnotationConfigApplicationContext(ProperTyValueConfig.class);
Boss boss =(Boss) applicationContext.getBean(Boss.class); //按照类型去拿
System.out.println(boss.getCar());
//再从容器中获取car 进行比对
Car carBean =applicationContext.getBean(Car.class);
System.out.println(carBean);
applicationContext.close();
}
}

打印:

来个有参构造器: 标注在有参构造器上面: Spring启动时候 调用有参构造器

@Component
public class Boss { private Car car; @Autowired
public Boss(Car car) {
this.car=car;
System.out.println("Boss 有参构造器 ");
} public Car getCar() {
return car;
}
// @Autowired //标注在方法上 spring容器创建对象时候 调用方法 完成赋值。方法使用的参数,自定义类型的值 从IOC获取值
public void setCar(Car car) {
this.car = car;
}
}

当然也可以放在参数位置:

    public Boss(@Autowired  Car car) {
this.car=car;
System.out.println("Boss 有参构造器 ");
}

如果只有一个有参构造器,注解可以省略。建议平时大家开发时候还是不要省略了吧

也可以在config里面这么玩儿

@Configuration
@ComponentScan({"com.toov5.Bean"})
public class ProperTyValueConfig { @Primary
@Bean(name="boss")
public Boss boss(Car car) {
Boss boss =new Boss();
boss.setCar(car);
return boss; }
}

Bean标注的方法创建对象的时候,方法参数的值从容器中获取!

原理可以看Aware接口

可以看下这个:

启动容器后,创建对象,需要的其他组件都会以接口方法回调的方式引入进来

bean:

@Component
public class Animal implements ApplicationContextAware,BeanNameAware,EmbeddedValueResolverAware {
private ApplicationContext applicationContext;
String color ;
String name;
public Animal() {
// TODO Auto-generated constructor stub
}
public Animal(String color, String name) {
super();
this.color = color;
this.name = name;
}
//第一个接口
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
System.out.println("传入IOC:"+applicationContext);
this.applicationContext=applicationContext; }
//第二个接口
public void setBeanName(String name) { //传入bean名字 通过名字去容器查找bean
System.out.println("当前bean的名字"+name); }
//第三个接口
//容器启动时候 创建对象 然后把resolver对象传递进来
public void setEmbeddedValueResolver(StringValueResolver resolver) { //解析字符串 # {} 等等
// TODO Auto-generated method stub
String resolveStringValue = resolver.resolveStringValue("你好${os.name} 我是#{30*1}");
System.out.println("解析的字符串"+resolveStringValue);
} }

config:

@Configuration
@ComponentScan({"com.toov5.Bean"})
public class ProperTyValueConfig { @Primary
@Bean(name="boss")
public Boss boss(Car car) {
Boss boss =new Boss();
boss.setCar(car);
return boss;
}
}

测试:

public class test {
@Test
public void test01(){
AnnotationConfigApplicationContext applicationContext =new AnnotationConfigApplicationContext(ProperTyValueConfig.class);
Boss boss =(Boss) applicationContext.getBean(Boss.class); //按照类型去拿
System.out.println(boss.getCar());
//再从容器中获取car 进行比对
Car carBean =applicationContext.getBean(Car.class);
System.out.println(carBean);
applicationContext.close();
}
}

打印:

自定义组件想要使用Spring容器底层的一些组件 (ApplicationContext  BeanFactory...)

自定义组件实现xxxAware; 在创建对象的时候,会调用接口规定的方法注入相关组件; Aware; 把Spring  底层一些组件注入到自定义的Bean

每个xxxAware 都会有相关的  xxxAwareProcessor   后置处理器

Spring注解(赋值相关)的更多相关文章

  1. spring注解的相关配置

    一.<context:annotation-config> 和 <context:component-scan> <context:annotation-config&g ...

  2. Spring注解 - 生命周期、属性赋值、自动装配

    一.Bean的生命周期 流程 Bean创建 -- 初始化 -- 销毁 创建: 单实例:在容器启动时创建对象 多实例:每次调用时创建对象 初始化: 都是在对象创建完成后,调用初始化方法 销毁: 单实例: ...

  3. 浅尝Spring注解开发_自定义注册组件、属性赋值、自动装配

    Spring注解开发 浅尝Spring注解开发,基于Spring 4.3.12 包含自定义扫描组件.自定义导入组件.手动注册组件.自动注入方法和参数.使用Spring容器底层组件等 配置 @Confi ...

  4. spring boot @ConditionalOnxxx相关注解总结

    Spring boot @ConditionalOnxxx相关注解总结 下面来介绍如何使用@Condition public class TestCondition implements Condit ...

  5. 【Spring注解驱动开发】如何使用@Value注解为bean的属性赋值,我们一起吊打面试官!

    写在前面 在之前的文章中,我们探讨了如何向Spring的IOC容器中注册bean组件,讲解了有关bean组件的生命周期的知识.今天,我们就来一起聊聊@Value注解的用法. 项目工程源码已经提交到Gi ...

  6. Spring 注解总结

    声明:这是转载的.内容根据网上资料整理.相关链接:http://www.360doc.com/content/10/1118/16/2371584_70449913.shtmlhttp://www.i ...

  7. Spring 注解编程之 AnnotationMetadata

    在上篇文章 Spring 注解编程之模式注解 中我们讲到 Spring 模式注解底层原理,依靠 AnnotationMetadata 接口判断是否存在指定元注解. 这篇文章我们主要深入 Annotat ...

  8. 0、Spring 注解驱动开发

    0.Spring注解驱动开发 0.1 简介 <Spring注解驱动开发>是一套帮助我们深入了解Spring原理机制的教程: 现今SpringBoot.SpringCloud技术非常火热,作 ...

  9. 【建议收藏】阿里P7总结的Spring注解笔记,把组件注册讲的明明白白

    环境搭建 注解的方式是通过配置类的方式来注入组件,注解注入要比XML注入的方式简单,注解注入也需要在前者的基础上,添加一个spring-context的包,也是实际开发中常用的方式. 准备所需Jar包 ...

随机推荐

  1. Android无线测试之—KEYCODE键值对应大全

    KEYCODE列表电话键键名 描述 键值 KEYCODE_CALL 拨号键5    KEYCODE_ENDCALL 挂机键6    KEYCODE_HOME 按键Home3    KEYCODE_ME ...

  2. 对IOS设备中UDID的一些思考

    本文转载至 http://blog.csdn.net/happyrabbit456/article/details/11565209 http://blog.csdn.net/xiaoguan2008 ...

  3. 初步了解 cURL

    今天需要用PHP模拟post请求,查了查资料,了解到cURL.看了一篇博客,写的很详细,就转载了,与大家分享.[原文链接] 什么是cURL?可能还有很多同学没有听说过这个工具,我先来给大家简单介绍下什 ...

  4. 【BZOJ1067】[SCOI2007]降雨量 RMQ+特判

    [BZOJ1067][SCOI2007]降雨量 Description 我们常常会说这样的话:“X年是自Y年以来降雨量最多的”.它的含义是X年的降雨量不超过Y年,且对于任意Y<Z<X,Z年 ...

  5. GIT界的神探--bisect

    GIT界的神探--bisect 今天我们需要使用git命令中的bisect破获一起凶杀案,下面请看具体案件: 在一个git仓库中有a,b,c,d,e,f,g,h,i,j,k这几个提交,在k提交中发现软 ...

  6. Pat 1052 Linked List Sorting (25)

    1052. Linked List Sorting (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue A ...

  7. 穿透Session 0 隔离(一)

    服务(Service)对于大家来说一定不会陌生,它是Windows 操作系统重要的组成部分.我们可以把服务想像成一种特殊的应用程序,它随系统的“开启-关闭”而“开始-停止”其工作内容,在这期间无需任何 ...

  8. 几种常见数据库查询判断表和字段是否存在sql

    1.MSSQL Server    表:select COUNT(*) from dbo.sysobjectsWHEREname= 'table_name':  字段:select COUNT(*)  ...

  9. 标准编译安装(cmake make)

    为什么要编译安装?因为根据需求可以个性化定制功能. 关键是阅读cmakelist,看都有哪些依赖,都有哪些选项可用,哪些选项是自己可以配置的. 一般流程: mkdir build cd build c ...

  10. 解锁Opera浏览器新姿势:【Surf The Internet In Right Ways】

    下载Opera浏览器 官网下载:https://www.opera.com/zh-cn 更改PC系统区域 我的本子是win10,其他系统未测. 进入: 设置 → 区域和语言 将国家或地区设置为:中国台 ...