1. 在pom.xml的依赖
  <dependencies>
<!--测试包-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
<version>4.11</version>
</dependency>
<!--spring 上下文-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.0.RELEASE</version>
</dependency>
<!--织入包-->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.9</version>
</dependency>
<!--高速代理生成包-->
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>3.2.4</version>
</dependency> </dependencies>

2.创建实体类Person和Computer两个实体类

package com.qf.pojo;

public class Computer {
String disk;
String cpu;
String memory;
String gpu; public Computer() {
System.out.println("空参构造");
} public Computer(String disk, String cpu, String memory, String gpu) {
this.disk = disk;
this.cpu = cpu;
this.memory = memory;
this.gpu = gpu;
} public String getDisk() {
return disk;
} public void setDisk(String disk) {
this.disk = disk;
} public String getCpu() {
return cpu;
} public void setCpu(String cpu) {
this.cpu = cpu;
} public String getMemory() {
return memory;
} public void setMemory(String memory) {
this.memory = memory;
} public String getGpu() {
return gpu;
} public void setGpu(String gpu) {
this.gpu = gpu;
} @Override
public String toString() {
return "Computer{" +
"disk='" + disk + '\'' +
", cpu='" + cpu + '\'' +
", memory='" + memory + '\'' +
", gpu='" + gpu + '\'' +
'}';
}
}
package com.qf.pojo;

import java.util.List;

public class Person {
String name;
int age;
Computer computer;
List<String> girlFriend; public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} public Computer getComputer() {
return computer;
} public void setComputer(Computer computer) {
this.computer = computer;
} public List<String> getGirlFriend() {
return girlFriend;
} public void setGirlFriend(List<String> girlFriend) {
this.girlFriend = girlFriend;
} @Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", computer=" + computer +
", girlFriend=" + girlFriend +
'}';
}
}

3.配置spring-config.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"> <!--Id和name:使用基本一致,name允许有一些特殊字符,name和id都唯一-->
<!--scope默认为singleton-->
<!--如果是属性注入,需要为每一个依赖类创建相应的getter和setter方法
-->
<!--属性装配-->
<bean class="com.qf.pojo.Computer" name="myComputer" scope="prototype" id="computer1">
<property name="disk" value="i7 7700HQ"></property>
<property name="memory" value="16GB"></property>
<property name="cpu" value="256G SSD 1TB"></property>
<property name="gpu" value="NVIDIA 1060"></property>
</bean> <!--构造装配,Computer必须有有参构造和无参构造-->
<bean class="com.qf.pojo.Computer" name="computer">
<constructor-arg name="cpu" value="i9 9700HQ"></constructor-arg>
<constructor-arg name="disk" value="512G SSD"></constructor-arg>
<constructor-arg name="gpu" value="NVIDIA 2080"></constructor-arg>
<constructor-arg name="memory" value="64G"></constructor-arg>
</bean> <!--自动装配autowire,默认按byType自动装配-->
<!--下面没有装配Computer,autowire会自动装配-->
<bean class="com.qf.pojo.Person" name="zhangsan" autowire="byName">
<property name="name" value="张三"></property>
<property name="age" value="18"></property>
<property name="girlFriend">
<!--集合装配-->
<list>
<value>小娜</value>
<value>小莎</value>
<value>小琪</value>
</list>
</property>
</bean> </beans>

自动装配

  • byName:通过反射到Person类,找到没有装配的Computer computer,根据computer和每个bean的name/id匹配,相同就装配,如果没有相同的就抛出异常。
  • byType:通过反射到Person类,找到没有装配的Computer属性, 按Bean的包名.class的class来匹配的,如果有多个class相同抛异常。
  • autowired按byType自动注入.

4.创建测试类TestSpringIoc

public class TestSpringIoc {
public static void main(String[] args) {
<!--可以初始化多个xml-->
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring-ioc.xml"); Computer computer1 =(Computer)context.getBean("computer1");
System.out.println(computer1); Person person = (Person)context.getBean("zhangsan",Person.class);
System.out.println(person); }
}

集合装配:如果对应bean的属性是一个集合则需要使用集合装配,Spring支持多种集合装配类型:
  • 对应类型为java.util.List、java.util.Vector 、java.util.Collection 、数组的属性
  • 对应类型为java.util.Set的属性
  • 对应类型为java.util.Map的属性
  • 对应类型为java.util.Properties的属性
示例
<!--List装配:-->
<property name=“list">
<list>
<value>a</value>
<value>b</value>
</list>
</property> <!--Set装配:(HashSet如何去重复,hashCode)-->
<property name=“set">
<set>
<value>a</value>
<value>b</value>
</set>
</property> <!--Map装配:-->
<property name=“map">
<map>
<entry key="1" value=“a"></entry>
<entry key="2" value=“b"></entry>
</map>
</property>

Annotation注解模式实现装配

1.修改spring-ioc.xml文件

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
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
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<!--声明使用注解开发-->
<context:annotation-config></context:annotation-config>
<!--组件扫描,扫描com.qf.pojo,如果含有spring组件注解,将被spring容器管理-->
<context:component-scan base-package="com.qf.pojo"></context:component-scan> </beans>

2.创建新的PersonAnnotation类

<!--定义为spring组件-->
@Component("personAnnotation")
public class PersonAnnotation { @Value("18")
int age;
@Value("张三")
String 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;
} @Override
public String toString() {
return "PersonAnnotation{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
}

3.创建新的测试类

public class AnnotationTest {
public static void main(String[] args) { ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-ioc-annotation.xml"); PersonAnnotation personAnnotation = applicationContext.getBean("personAnnotation", PersonAnnotation.class);
System.out.println(personAnnotation);
}
}
  • Annotation的优缺点:

    • 优点:灵活、简单、开发效率高
    • 缺点:在不合适的情况下,滥用注解会违反ioc的思想

(四)SpringIoc之Bean装配的更多相关文章

  1. Spring Boot源码(四):Bean装配

    为了演示Spring中对象是如何创建并放到spring容器中,这里新建一个maven项目: 其中pom.xm文件中只引入了一个依赖: <dependencies> <dependen ...

  2. Spring使用笔记(二)Bean装配

    Bean装配 Spring提供了3种装配机制: 1)隐式的Bean发现机制和自动装配 2)在Java中进行显示装配 3)在XML中进行显示装配 一)自动化装配 1.指定某类为组件类: @Compone ...

  3. 使用Spring IoC进行Bean装配

    Spring概述 Spring的设计严格遵从的OCP(开闭原则),保证对修改的关闭,也就是外部无法改变spring内部的运行流程:提供灵活的扩展接口,也就是可以通过extends,implements ...

  4. Spring Bean装配(下)——注解

    @Repository,@Service,@Controller这三个注解是基于component定义的注解 component-scan:组件扫描 base-package:扫描这个下的所有类 &l ...

  5. 【Spring】Spring的bean装配

    前言 bean是Spring最基础最核心的部分,Spring简化代码主要是依赖于bean,下面学习Spring中如何装配bean. 装配bean Spring在装配bean时非常灵活,其提供了三种方式 ...

  6. 使用spring框架,用xml方式进行bean装配出现“The fully qualified name of the bean's class, except if it serves...”

    使用spring框架,用xml方式进行bean装配出现“The fully qualified name of the bean's class, except if it serves...”. 原 ...

  7. Spring中四种实例化bean的方式

    本文主要介绍四种实例化bean的方式(注入方式) 或者叫依赖对象实例化的四种方式.上面的程序,创建bean 对象,用的是什么方法 ,用的是构造函数的方式 (Spring 可以在构造函数私有化的情况下把 ...

  8. Spring对Bean装配详解

    1.Spring提供了三种装配bean的方式: 2.自动装配bean: 3.通过Java代码装配bean 4.通过XML装配bean 前言:创建对象的协作关系称为装配,也就是DI(依赖注入)的本质.而 ...

  9. Spring Bean装配学习

    解释:所谓装配就是把一个类需要的组件给它设置进去,英文就是wire,wiring:注解Autowire也叫自动装配. 目前Spring提供了三种配置方案: 在XML中进行显式的配置 在Java中进行显 ...

随机推荐

  1. C语言的结构体和 C++结构体的区别

     C语言的结构体和 C++结构体的区别 关于C++中声明结构体中需要使用构造器创建实例对象的语法: <C++的结构体构造方法的基本概念:结构体的构造方法需要和结构体的名字相同,并且无返回值,也不 ...

  2. python 【第三篇】函数基础

    深浅拷贝 set是一个无序且不重复的元素集合访问速度快天生解决重复问题 #!/usr/bin/env python3 # -*- coding:utf-8 -*- #深浅拷贝 import copy ...

  3. web前端开发 代码规范 及注意事项

    web前端开发 代码规范 及注意事项 外部命名规范 html .js .css文件名称命名规范 my_script.js my_camel_case_name.css my_index.html 路径 ...

  4. CSS的两个class选择器紧挨在一起

    有一段HTML代码: <a class="glyphicons white no-js cogwheel" href="#" target="_ ...

  5. 【bzoj1965】[Ahoi2005]SHUFFLE 洗牌

    x*2^m==l (mod n+1)x=(n/2+1)^m*l mod n+1 #include<algorithm> #include<iostream> #include& ...

  6. 请说出作用域public,private,protected,以及不写时的区别

    这四个作用域的可见范围如下表所示. 说明:如果在修饰的元素上面没有写任何访问修饰符,则表示friendly. 作用域    当前类 同一package 子孙类 其他package public    ...

  7. Class.forName() 详解

    主要功能 Class.forName(xxx.xx.xx)返回的是一个类 Class.forName(xxx.xx.xx)的作用是要求JVM查找并加载指定的类, 也就是说JVM会执行该类的静态代码段 ...

  8. Lightoj 1003 - Drunk(拓扑排序)

    One of my friends is always drunk. So, sometimes I get a bit confused whether he is drunk or not. So ...

  9. nginx性能优化技巧

    前几天买了本高俊峰的<高性能Linux服务器构建实战I>,网上都说运维必备手册,昨天看了目录加小50页感觉还是比较扩充视野的,很多东西在学校是不可能学到的,就是感觉有的地方讲的仍然不是很清 ...

  10. hdu-4118 Holiday's Accommodation(树形dp+树的重心)

    题目链接: Holiday's Accommodation Time Limit: 8000/4000 MS (Java/Others)     Memory Limit: 200000/200000 ...