1、IOC容器概念
IOC:Inverse of Control,控制反转,将对象的创建权反转给Spring
对于spring框架来说,就是由spring来负责控制对象的生命周期和对象间的关系。而Spring提供了IOC容器来帮我们生成所需要的对象。也就是说在我们原先的对象中有用到其他对象的地方Spring会帮我们来注入。
1)控制反转,把对象创建和对象之间的调用过程,交给Spring进行管理。
2)使用IOC目的:为了耦合度降低
A类想要调用B类就必须自己在自己的内部新建B类的对象,这样的耦合度太高
Spring ----------------> IOC 控制权翻转
(4).基于注解的方式实现Bean管理和注入属性
一、配置xml,配置创建对象
<bean id="demo" class="com.qcby.service.Demo"/>
在service创建UserService类
在xml中配置bean
<bean id="user" class="com.qcby.service.UserService"/>
创建UserServiceTest测试类
public class UserServiceTest {
@Test
public void demo(){
ApplicationContext ac = new AnnotationConfigApplicationContext(SpringConfig.class);
UserService user = (UserService) ac.getBean("userService");
user.run();
System.out.println(user.toString());
}
}
基于set方法进行依赖注入
测试输出结果,demo输出的是demo的地址
遇到了数组、集合、map
在UserService中定义
生成set get方法以及构造函数
数组strs
用property
array
value
<property name = "strs">
<array>
<value>aaa</value>
<value>aa</value>
<value>a</value>
</array>
</property>
集合List
<property name = "list">
<list>
<value>aaa</value>
<value>a</value>
</list>
</property>
map
key是MAP中的第一个String
value是第二个String
<property name = "map">
<map>
<entry key="aaa" value="小黑"/>
<entry key="bbb" value="小白"/>
</map>
</property>
输出
用构造器的方式实现
public UserService(Integer age, String name, String sex, Demo demo) {
this.age = age;
this.name = name;
this.sex = sex;
this.demo = demo;
}
@Override
public String toString() {
return "UserService{" +
"age=" + age +
", name='" + name + '\'' +
", sex='" + sex + '\'' +
", demo=" + demo +
'}';
}
xml中
<constructor-arg name="age" value="17"/>
<constructor-arg name="name" value="admin"/>
<constructor-arg name="sex" value="男"/>
<constructor-arg name="demo" ref="demo"/>
数组、集合、map
private String[] strs;
private List<String> list;
private Map<String,String>map;
public UserService(String[] strs, List<String> list, Map<String, String> map) {
this.strs = strs;
this.list = list;
this.map = map;
}
<constructor-arg index="0">
<array>
<value>aaa</value>
<value>aa</value>
<value>a</value>
</array>
</constructor-arg>
<constructor-arg index="1">
<list>
<value>ab</value>
<value>abc</value>
</list>
</constructor-arg>
<constructor-arg index="2">
<map>
<entry key="aaa" value="小黑"/>
<entry key="bbb" value="小白"/>
</map>
</constructor-arg>
index也可以改成name
1.什么是注解
①:注解是代码特殊标记,格式:@注解名称(属性名称=属性值,属性名称=属性值...)
②:使用注解,注解作用在类上面,方法上面,属性上边
③:使用注解的目的:简化XML配置
2.Spring针对Bean管理中创建对象提供的注解
@Component 普通的类
@Controller 表现层
@Service 业务层
@Repository 持久层
*上边四个功能一样,都可以用来创建bean实例
@Autowired:自动按类型注入,如果有多个匹配则按照指定的Bean的id查找
@Qualifier:在自动按照类型注入的基础上再按照Bean的id注入,给变量注入时必须搭配@Autowired,给方法注入时可单独使用
@Resource:直接按照Bean的id注入,只能注入Bean类型
@value:用于注入基本数据类型和String类型
Spring.xml中
<!--开启注解扫描--> <context:component-scan base-package="com.qcby"/>
扫描哪个包,base-package后面写哪个包名
新建entity包,建User类
我们想要扫描到User的注解,需要扫描entity包
com.qcby包含了entity包,直接写com.qcby可以扫描到qcby下面的包
但如果只写com.qcby.service,就不会扫描到entity
生成对象调用方法
public void hello(){
System.out.println("hello world");
}
配置@Component
在@Compontent 加上value值
@Component(value = "user")
获取到谁是由value值决定
用@value给对象注值
@Value("18")
private Integer age;
@Value("张三")
private String name;
@Value("男")
private String sex;
@Autowired 默认按类型自动装配
@Resource java提供的注解,也被支持,使用name属性,按名称注入
@Qualifiter按名称注入