传统的Spring做法是使用.xml文件来对bean进行注入,这样做既麻烦又难维护。所以Spring后来引入了注解,大大减少配置文件,增加了web代码的可读性。
(一)xml配置注入bean
1.创建bean
public class Student { public Student(String name, int age) { this.name = name; this.age = age; } public Student() { } private String name; private int age; setter and getter ...
2.添加xml配置
<bean id="student" class="com.fantj.bean.Student"> <property name="age" value="18"/> <property name="name" value="FantJ"/> </bean>
id
表示bean的唯一标识,从bean工厂里获取实例化对象就是靠它,一般是类首字母小写。 property
用来初始化类的字段值,比如我初始化name=FantJ,age=18
。
3.执行查看结果
public static void main(String[] args) { ApplicationContext applicationContext = new ClassPathXmlApplicationContext("bean.xml"); Student person = (Student) applicationContext.getBean("student"); System.out.println(person); }
这个getBean
方法返回的是Object对象,但是我们很确定根据student这个id取出的就是Student的实例化对象,所以我们可以直接在这里做强制类型转换。
Student{name='FantJ', age=18}
(二)注解注入bean
官方定义:IoC又叫依赖注入(DI)。它描述了对象的定义和依赖的一个过程。依赖的对象通过构造参数、工厂方法参数或者属性注入,当对象实例化后依赖的对象才被创建,当创建bean后容器注入这些依赖对象。这个过程基本上是反向的。
(1)在Spring中,一个类我们为它加上注解就可以被识别为一个Bean
例如你在一个类上加上一个@Component注解,它在配置类的@ComponentScan注解扫描的包下,或者把这给个类在配置类中加上@Bean注解,那么它就被识别为Bean,加入到Spring容器里。
@Component public class FirstBean { }
或者直接把这个类在Spring配置类里实例化然后使用@Bean注解。
@Configuration @ComponentScan("com.imooc.spring.demo") public class SpringBeanConfiguration { @Bean public FirstBean firstBean() { return new FirstBean(); } }
(2)在一个Bean中调用另外一个Bean,就需要依赖注入
@Component public class SecondBean { private FirstBean firstBean; @Autowired public SecondBean(FirstBean firstBean) { this.firstBean = firstBean; } @Override public String toString() { return "SecondBean{firstBean=" + firstBean + '}'; } }
一个Bean要调用另一个Bean,直接调用是允许的,需要通过自动装配注解@Autowired进行依赖注入才能达成目的。
常用注解
注解 | 解释 |
---|---|
@Configuration | 标记的类是配置类 |
@ComponentScan(“包”) | 指定哪个包,就扫描哪个包下的注解并识别。 |
@Autowired | Bean的自动装配,可以标注在类的属性、方法及构造函数上。 |
@Component | 把普通类标记为Bean,加入到容器里,并且是单例模式。 |
@Bean | 定义一个Bean对象,加入到Spring容器里 |
@Order(数字) | 容器加载Bean的优先级,数字越小优先级越高 |
1.注入Bean的不同方式
首先通过Configuration和@ComponentScan创建一个Spring的配置类。
@Configuration @ComponentScan("com.imooc.spring.demo.bean")//项目的包名 public class SpringBeanConfiguration { }
新建一个类FirstBean,通过@Component注解标记为Bean,加入到Spring容器里。
@Component public class FirstBean { }
(1)通过构造方法注入
@Component public class SecondBean { private FirstBean firstBean; @Autowired public SecondBean(FirstBean firstBean) { this.firstBean = firstBean; } @Override public String toString() { return "SecondBean{firstBean=" + firstBean + '}'; } }
(2)通过Set方法注入
@Component public class ThirdBean { private FirstBean firstBean; @Autowired public void setFirstBean(FirstBean firstBean) { this.firstBean = firstBean; } @Override public String toString() { return "ThirdBean{firstBean=" + firstBean + '}'; } }
(3)通过属性注入
@Component public class FourthBean { @Autowired private FirstBean firstBean; @Override public String toString() { return "FourthBean{firstBean=" + firstBean + '}'; } }
属性注入时,private私有属性,Spring是通过反射去加载它到Spring容器里的。
(4)通过集合注入Bean
新建一个类FifthBean,标记为Bean。 加入一个List类型 的属性,用@Autowired注入。
在配置类中对加入一个返回值为List的方法或者加两个返回String的方法,使用Bean注解,这样就完成集合的赋值。
@Component public class FifthBean { @Autowired private List<String> stringList; public List<String> getStringList() { return stringList; } }
@Configuration @ComponentScan("com.imooc.spring.demo") public class SpringBeanConfiguration { @Bean public List<String> stringList() { List<String> list = new ArrayList<>(); list.add("hello"); list.add("imooc"); return list; } }
@Configuration @ComponentScan("com.imooc.spring.demo") public class SpringBeanConfiguration { @Bean public String firstString() { return "bye"; } @Bean public String secondString() { return "imooc"; } }
第二种方式的优先级高于第一种,两种同时存在时Spring默认使用第二种,若要控制优先级要使用@Order注解来控制优先级顺序
2.例子
(1)创建配置类
@Configuration public class MyConfig { @Bean public Student student(){ return new Student("FantJ",20); } }
- 先看
@Bean
注解,这个注解就是把Student这个类加载到IOC容器,我们看不到它的id
和property
,id默认是方法名,当然也可以手动设置(不建议),以这样的方式设置:@Bean("xxx")
。那如何初始化它的字段值呢,我们返回一个带有值的实例化对象就行。 - 那
@Configuration
注解是干嘛的呢,它用来声明这是一个配置类,Spring容器启动要来加载我这个类,如果不加这个配置,spring启动不会加载到它。既然Spring能来加载这个类,就会发现Bean注解,自然也把bean就加载了。当然这样的注解有很多,比如@Compoment、@Controller、@Servic
e等都能完成,只不过它们有它们的特定使用的规范。最好不要乱用,造成代码可读性差。
(2)测试
ApplicationContext applicationContext1 = new AnnotationConfigApplicationContext(MyConfig.class); Student bean = applicationContext1.getBean(Student.class); System.out.println(bean);
Student{name='FantJ', age=20}
(3)@Component加载bean
千万不要以为注解加载Bean只有
@Configuration
能做到。
@Component public class ComponentTest { @Bean public Student student(){ return new Student("FantJ",21); } }
ApplicationContext applicationContext2 = new AnnotationConfigApplicationContext(ComponentTest.class); Student bean1 = applicationContext2.getBean(Student.class); System.out.println(bean1);
Student{name='FantJ', age=21}
标签:firstBean,public,Bean,Student,注解,class,注入 From: https://www.cnblogs.com/imreW/p/17413540.html