Bean装配

Spring提供了3种装配机制:

1)隐式的Bean发现机制和自动装配

2)在Java中进行显示装配

3)在XML中进行显示装配

一)自动化装配

1.指定某类为组件类:

@Component
public class Dog {
private String name = "Jerry";
//省略getter/setter
}
public interface Person {
void introduce();
}
//表明该类会作为组件,告知Spring为该类创建bean
//该组件的默认id为:student
@Component
//@Component("aStudent") 为该bean指定id:aStudent
//当然也可以使用Java依赖注入规范:
//@Named("aStudent")
public class Student implements Person{
@Autowired
private Dog dog;
private String name = "Tom";
private int age = 6;
private String school = "Happy School"; public Student() {
}
public Student(String name, int age, String school) {
this.name = name;
this.age = age;
this.school = school;
} public void introduce() {
System.out.println("My name is " + name + ", I'm " + age +
" years old. I'm from " + school + " !");
System.out.println("I have dog named " + dog.getName());
}
//省略getter/setter
}

2.创建配置类启用组件扫描

1)通过Java配置:

@Configuration
//@ComponentScan 启用组件扫描功能,此时是扫描该类所在包下的所有组件类
@ComponentScan("beans") //设置要扫描的包
//@ComponentScan(basePackages = "beans") 同上
//@ComponentScan(basePackages = {"a", "b", "c"}) 扫描多个包
//@ComponentScan(basePackageClasses = {a.class, b.class, c.class}) 扫描class所在包
public class PersonConfig {
}

2)通过xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:Context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd"> <Context:component-scan base-package="beans"/>
</beans>

3.测试: 

//该注解创建了Spring应用上下文
@RunWith(SpringJUnit4ClassRunner.class)
//加载配置
@ContextConfiguration(classes = PersonConfig.class)
public class PersonTest {
//@Autowired(required = false) 设置为false没有匹配bean时不抛出异常
@Autowired //当然该注解也可用于方法
Person student;
@Test
public void say() {
student.introduce();
//My name is Tom, I'm 6 years old. I'm from Happy School !
//I have dog named Jerry
}
}

二)通过Java装配

public class Father implements Person{
private Student student;
public Father(Student student) {
this.student = student;
}
public void introduce() {
System.out.println("I'm " + student.getName() + "'s father.");
}
}
@Configuration
public class PersonConfig {
@Bean
public Dog dog() {
Dog dog = new Dog();
dog.setName("Flex");
return dog;
} @Bean //告诉Spring返回的对象注册为Spring应用上下文的bean
//@Bean(name = "aName") 修改默认名字
public Student getStudent(){
Student student = new Student("Jimmy", 22, "Sad School");
student.setDog(dog());
return student;
} //此处注解会拦截getStudent()方法,传入Spring创建的单例
@Bean
public Father getFather() {
return new Father((Student) getStudent());
} //通过这种方法引用其他bean是最佳方式
//因为它不要求将person声明到同一配置文件中
public Person father(Person person) {
return new Father((Student) person);
}
}
@Autowired
Student student;
@Autowired
Father father;
@Test
public void say() {
student.introduce();
father.introduce();
/*My name is Jimmy, I'm 22 years old. I'm from Sad School !
I have dog named Flex
I'm Jimmy's father.*/
}

三)通过XML装配

PersonTest-contxt.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean class="beans.Book" id="book1">
<property name="bookName" value="YellowBook"/>
</bean>
<bean class="beans.Book" id="book2">
<property name="bookName" value="GreenBook"/>
</bean>
<bean class="beans.Dog" id="dog">
<!--属性注入必须提供相应的属性set方法-->
<property name="name" value="小白"/>
</bean>
<bean class="beans.Student" id="student">
<property name="dog" ref="dog"/>
<constructor-arg value="Harry"/>
<constructor-arg value="28" />
<constructor-arg value="Killer School"/>
<property name="books">
<list>
<ref bean="book1"/>
<ref bean="book2"/>
</list>
</property>
</bean>
<bean class="beans.Father" id="father">
<constructor-arg ref="student" />
</bean>
</beans>
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration // @ContextConfiguration(locations = { "classpath*:/spring1.xml", "classpath*:/spring2.xml" })
public class PersonTest {
@Autowired
Student student;
@Autowired
Father father;
@Test
public void say() {
student.introduce();
father.introduce();
/* My name is Harry, I'm 28 years old. I'm from Killer School !
I have dog named 小白
I have 2 books.
I'm Harry's father.*/ }
}

四)导入混合配置

1.在JavaConfig导入其他JavaConfig

@Import(AnotherConfig.class)
@Import({One.class, Tow.class})

2.在JavaConfig中导入xml配置

@ImportResource("classpath: one.xml")

3.在xml中导入其他xml

<import resoune="one.xml">

注意并没有XML能导入JavaConfig

Spring使用笔记(二)Bean装配的更多相关文章

  1. Spring学习笔记(二)之装配Bean

    一,介绍Bean的装配机制 在Spring中,容器负责对象的创建并通过DI来协调对象之间的关系.但是我们要告诉Spring创建哪些Bean并且如何将其装配在一起.,装配wiring就是DI依赖注入的本 ...

  2. Spring系列(二) Bean装配

    创建应用对象之间协作关系的行为称为装配(wiring), 这也是DI的本质. Spring中装配Bean的方式 Spring提供了三种装配Bean的方式. 隐式的Bean发现机制和自动装配 Java ...

  3. Spring初学笔记(二):Bean的注入

    关于Bean的注入 在上一篇中,已经说到虽然注入确实可以降低类与类之间的耦合,但并没有解决调用者必须知道类的创建方法的问题,也可以说是没有实现调用者与类实现的解耦,我们也提到,为了实现两者的解耦,可以 ...

  4. Spring学习系列(二) 自动化装配Bean

    一.Spring装配-自动化装配 @Component和@ComponentScan 通过spring注解(@Component)来表明该类会作为组件类,并告知Spring要为这类创建bean,不过组 ...

  5. Spring学习笔记(3)——Bean的注入方式

    依赖注入 依赖注入支持属性注入.构造函数注入.工厂注入. 属性注入: 属性注入即通过setXxx()方法注入Bean的属性值或依赖对象 属性注入要求Bean提供一个默认的构造函数(无参构造函数),并为 ...

  6. Spring学习笔记(三)之装配Bean

    除了组件扫描与自动装配之外还有基于Java代码的装配与基于XML的装配. 有一些场景是我们不能用自动装配的,比如我们要给第三方库中的组件装配到我们的应用中,这时自动装配无效,因为自动装配只能扫描本应用 ...

  7. spring深入学习(二)-----bean的生命周期、IOC容器bean装配

    bean的生命周期 1.实例化Bean对于BeanFactory容器,当客户向容器请求一个尚未初始化的bean时,或初始化bean的时候需要注入另一个尚未初始化的依赖时,容器就会调用createBea ...

  8. 【spring学习笔记二】Bean

    ### bean的三种实例化方式: 1.构造 2.静态工厂 3.实例工厂 其中,工厂就是工厂的概念,工厂函数factor-method会返回她生产出来的产品类. 而构造初始化也可以选择初始化方式和销毁 ...

  9. spring学习笔记二 注解及AOP

    本节需要导入spring-aop包 注解 使用注解的目的是为了代替配置,在使用注解时,省略键时,则是为value赋值. 扫描某个包下的所有类中的注解 <?xml version="1. ...

  10. Spring Boot笔记二:快速创建以及yml文件自动注入

    上个笔记写了如何自己去创建Spring boot,以及如何去打jar包,其实,还是有些麻烦的,我们还自己新建了几个文件夹不是. Idea可以让我们快速的去创建Spring boot应用,来看 一.快速 ...

随机推荐

  1. 第四周学习总结-HTML

    2018年8月5日 这是暑假第四周,这一周我在菜鸟教程网学到了许多HTML的知识.HTML编写网页不像C语言.Java语言那必须有主方法.主函数什么的,它基本上都是标签(元素),但是它可以与CSS(层 ...

  2. Jumpserver里常用的sudo权限控制模板

    ALL,!/bin/bash,!/bin/tcsh,!/bin/su,!/usr/bin/passwd,!/usr/bin/passwd root,!/bin/vim /etc/sudoers,!/u ...

  3. JS实现继承的几种方式(转)

    转自:幻天芒的博客 前言 JS作为面向对象的弱类型语言,继承也是其非常强大的特性之一.那么如何在JS中实现继承呢?让我们拭目以待. JS继承的实现方式 既然要实现继承,那么首先我们得有一个父类,代码如 ...

  4. jmeter从CSV中获取非正常string

    jmeter从CSV中获取非正常string,如CSV中有一列值为{"firstname":"Jade"},那么在beanshell中如何获取并解析? 一般的用 ...

  5. Java接口自动化测试之TestNG测试报告ExtentReports的应用(三)

    pom.xml导入包 <?xml version="1.0" encoding="UTF-8"?> <project xmlns=" ...

  6. 最短路径问题---Dijkstra算法详解

    侵删https://blog.csdn.net/qq_35644234/article/details/60870719 前言 Nobody can go back and start a new b ...

  7. Mongodb for .Net Core 封装类库

    一:引用的mongodb驱动文件版本为 Mongodb.Driver 20.4.3 二:我只是进行了常用方法的封装,如有不当之处,请联系我 创建mongodb的连接 using MongoDB.Bso ...

  8. WARN conf.FlumeConfiguration: Could not configure sink sink1 due to: No channel configured for sink: sink1 org.apache.flume.conf.ConfigurationException: No channel configured for sink: sink1

    1.错误如下所示,启动flume采集文件到hdfs案例的时候,出现如下所示的错误: 大概是说No channel configured for sink,所以应该是sink哪里配置出现了错误,百度了一 ...

  9. golang 的glide包管理使用技巧教程

    安装glide ➜ wemall git:(master) ✗ go get github.com/Masterminds/glide ➜ wemall git:(master) ✗ go insta ...

  10. 选择结构if

    1.if语句 if语句是指如果满足某种条件,就进行某种处理.例如,小明妈妈跟小明说“如果你考试得了100分,星期天就带你去游乐场玩”.这句话可以通过下面的一段伪代码来描述. 如果小明考试得了100分 ...