这几天因为要面试java实习,了解到大部分公司对实习生的三大框架的掌握程度很重视,而之前上课时老师又没讲到三大框架,所以一直在自学,今天就简单记录一下,有误的地方,望各位指点。
IOC(Inversion of Control) 即控制反转,又名依赖注入(DI,Dependency Injection) 。IOC使程序组件之间或类之间尽量形成一种松耦合的结构,对于之前的程序开发,我们在使用一个类的实例之前需要先new出这个类的实例,而IOC会将创建实例的任务交给IOC容器,这样我们就只要直接使用这个实例就好。IOC容器创建实例的过程为:从配置文件中读取JavaBean的定义信息—–>根据定义信息去创建JavaBean的实例对象—–>注入其依赖的属性。简单这样说好像不易于理解,下面通过简单的配置文件讲解一下:
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
**<bean id="person" class="bean.Person">
<property name="name" value="ZHJ"/>
<property name="age" value="24"/>
</bean>**
</beans>
这里主要看一下加粗的部分,bean是配置文件中的beans元素中的一个子元素,IOC容器会根据bean中的class属性对应的类名来确定实例化哪个类,property里是注入的属性,最后会放上具体代码的,方便理解。
另外说明一下,bean只是Spring容器初始化、装配及被管理的对象,Spring IOC容器管理一个或多个bean。
IOC有三种实现类型,分别是:接口注入,Setter注入,构造器注入。下面会放上三种类型的具体代码:
先放上Spring包地址:http://pan.baidu.com/s/1sjDbzrR
1.接口注入,基于接口将调用与实现分离,Spring不支持这种IOC方式,因为这种方式必修实现接口中的方法,具有入侵性。
2,Setter注入,基于JavaBean的Setter方法为属性赋值,接下来看具体代码:
(1)先创建一个Bean.xml文件,代码如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<bean id="person" class="cn.zafu.bean.Person">
<property name="name" value="ZHJ"/>
<property name="age" value="24"/>
</bean>
</beans>
(2)接下来在包cn.zafu.bean下创建待实例化的类Person
package cn.zafu.bean;
public class Person {
private String name;
private int age;
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 void info(){
System.out.println("Setter注入,name="+getName()+",age="+getAge());
}
}
(3)创建要调用Person的类test
package cn.zafu.bean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import cn.zafu.bean.Person;
public class test {
public static void main(String[] args){
ApplicationContext ctx = new ClassPathXmlApplicationContext("bean.xml");//从classpath路径上装载xml的配置信息
Person p = ctx.getBean("person",Person.class);//创建bean的引用对象
p.info();
}
}
(4)运行结果为:
Setter注入,name=ZHJ,age=24
3.构造器注入,基于类的构造方法为属性赋值,代码如下:
(1)创建想要被实例化的类Person
package cn.zafu.GouZaoQi;
public class Person {
private String name;
private int age;
public Person(String name,int age)
{
this.name = name;
this.age = age;
}
public void printInfo()
{
System.out.println("构造器实现依赖注入:name = "+name+",age = "+age);
}
}
(2)在src下创建配置文件GZQBean.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<bean id="person" class="cn.zafu.GouZaoQi.Person">
<!-- 通过多个constructor-arg标签完成对构造函数的传参,index属性用于指定构造方法的参数索引 -->
<constructor-arg index = "0" value="ZHJ"/>
<constructor-arg index = "1" value="24"/>
</bean>
</beans>
(3)测试类Main
package cn.zafu.GouZaoQi;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Main {
public static void main(String[] args) {
//装载配置文件
ApplicationContext ctx = new ClassPathXmlApplicationContext("GZQBean.xml");
//获取配置信息,对相应的类实例化
Person p = (Person)ctx.getBean("person");
p.printInfo();
}
}
(4)运行结果为:
构造器实现依赖注入:name = ZHJ,age = 24
以上就是Setter注入和构造器注入的简单例子,另外在Spring中还可以通过配置文件使用元素引用其他JavaBean的实例对象,例如将Person注入到另一个类Manager中,然后通过Manager输出Person的信息,代码如下:
(1)Person类和构造器中的一样,这里不再重复,Manager类如下:
package cn.zafu.GouZaoQi;
public class Manager {
private Person person;
private int num;
public Person getPerson() {
return person;
}
public void setPerson(Person person) {
this.person = person;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public void Info()
{
person.printInfo();
System.out.println(",num = "+num);
}
}
(2)配置文件GZQBean.xml如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans
<!--class标签指定待实例化的类的路径-->
<bean id="person" class="cn.zafu.GouZaoQi.Person">
<!-- 通过多个constructor-arg标签完成对构造函数的传参,index属性用于指定构造方法的参数索引 -->
<constructor-arg index = "0" value="ZHJ"/>
<constructor-arg index = "1" value="24"/>
</bean>
<!--class标签指定待实例化的类的路径-->
<bean id="manager" class="cn.zafu.GouZaoQi.Manager">
<property name="num" value="5"/>
<!--表示引用bean的名称为person所对应的类的实例对象-->
<property name = "person" ref ="person"/>
</bean>
</beans>
(3)测试类Main如下:
package cn.zafu.GouZaoQi;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Main {
public static void main(String[] args) {
//装载配置文件
ApplicationContext ctx = new ClassPathXmlApplicationContext("GZQBean.xml");
//获取配置信息,对相应的类实例化
Manager manager = (Manager)ctx.getBean("manager");
manager.Info();
}
}
(4)运行结果如下:
构造器实现依赖注入:name = ZHJ,age = 24,num = 5
关于IOC细节知识还有很多,以后会陆续有补充,今天暂时先写到这里,如果上述有什么问题,还望请大牛们给与指点。