ioc
ioc控制反转:把创建对象的权力交给框架,为了削减程序间的耦合(接触代码的依赖关系)
对象由spring进行创建,管理,装配,用户通过操作xml文件来实现不同的操作
maven导spring包
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
三层架构
(核心)业务层:功能的实现的模块,对数据的操作,业务成调用持久层
持久层:读取数据库区域
表现层:接受用户的请求和输入数据,提供数据交互的界面
用户的需求 改变,原来的代码就不能满足需求,就要根据具体需求去修改原来的代码,这就破环了程序的完整性。在程序量大时,修改一次的成本就十分昂贵
利用一个set接口实现(主要就是spring在内部调用set方法来获取方法
public class hello {
private String str;
public String getStr() {
return str;
}
public void setStr(String str) {
this.str = str;
}
@Override
public String toString() {
return "hello{" +
"str='" + str + '\'' +
'}';
}
}
之前:程序时主动创建对象
(ioc的原型)set后:程序就没了主动性,不用管理对象的创建,系统的耦合性大大降低,可以专注于业务层的实现,只需要被动接收就行了(更改一次需求,修改的代码少了)
主动的编程变成被动的接收
<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-3.0.xsd">
<!-- 使用spring来创建对象,在spring中这些全是bean
类型 变量名=new 类型()
bean标签
id:等价于变量名
class:new的对象
property标签:相当于给对象的属性设置一个值
name:成员变量名字(利用hello类中的set方法进行注入,所以bean必须实例化)
value:传入的参数
-->
<bean id="hello" class="com.pojo.hello">
<property name="str" value="Spring"/>
</bean>
</beans>
实现
public static void main(String[] args) {
// 获取spring上下文对象
ApplicationContext context=new ClassPathXmlApplicationContext("beans.xml");
// 我们的对象全在spring中管理,要使用时,直接进入spring中取出来
hello hello = (hello)context.getBean("hello");
System.out.println(hello);
}
通过使用ApplicationContext来创建BeanFactory的实例,其中包含两个实现类
FileSystemXmlApplicationContext和ClassPathXmlApplicationContext,所以我使用了
ClassPathXmlApplicationContext cpx = new ClassPathXmlApplicationContext("beans.xml");
由于是包含的关系,所以依然可以从配置文件中得到类方法(官方文档建议使用ApplicationContext)
ioc创建对象的方法
user对象:
public class user {
private String name;
public user(String name){
this.name=name;
}
public void show(){
System.out.println("名字为"+name);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "user{" +
"name='" + name + '\'' +
'}';
}
}
- 默认使用无参构造
- 如果使用有参构造的话
下标赋值
<bean id="user" class="pojo.user">
<constructor-arg index="0" value="kobe"/>
</bean>
根据参数的数据类型进行匹配
(如果构造方法中出现相同的数据类型时就显得很局限了)
<bean id="user" class="pojo.user">
<constructor-arg type="java.lang.String" value="kobe"/>
</bean>
直接使用参数名来进行构造
<bean id="user" class="pojo.user">
<constructor-arg name="name" value="kobe"/>
</bean>
在加载配置文件的同时,容器管理的对象就已经初始化了