Ioc(inversion of controller)控制反转 是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。
控制:
谁控制数:spring容器控制对象,传统模式需要对象就new对象,现在把new对象的权利交给spring容器去创建对象
控制什么:控制对象
反转:如果一个对象需要用到另外一个对象,自己new 正转,反转直接把需要的对象告诉容器,容器会自动给你
哪些地方被反转了:依赖的对象被反转了
容器:applicationContext ---> getBean(“bean name 或者id ”)
DI(Dependency Injection,简称DI):其中最常见的方式叫做依赖注入
注入方式:
Set 构造方法 接口注入
构造方法 :指腹为婚
Set: 心中已经有目标了
接口:描述
Ioc的入门应用
1.导包
2.创建spring容器
Springioc默认的是单例模式
<?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-2.0.xsd">
<!--scope="singleton"单例
prototype 多例-->
<bean name="person" class="com.ujiuye.bean.PersonBean">
<property name="pid" value="10"/>
<property name="pname" value="张三"/>
<property name="address" value="北京"/>
<!-- ref 引用其他对象-->
<property name="card" ref="cardbean"/>
</bean>
<bean name="cardbean" class="com.ujiuye.bean.CardBean">
<property name="cid" value="10"/>
<property name="cnum" value="110"/>
</bean>
</beans>
3.测试类
@Test
public void test1(){
//1.获取spring容器
ApplicationContext app=new ClassPathXmlApplicationContext("bean.xml");
//2.获取实例
PersonBean p= (PersonBean) app.getBean("person");
PersonBean p2= (PersonBean) app.getBean("person");
System.out.println(p);
System.out.println(p==p2);
}
Name 和id区别:
Name后面可以跟多个名称 id只能有一个
name="person,p2,p3"
使用构造方法注入
<!--使用有参的构造方法di-->
<bean name="p4" class="com.ujiuye.bean.PersonBean">
<constructor-arg index="0" value="10"/>
<constructor-arg index="1" value="李四"/>
<constructor-arg index="2" value="上海"/>
</bean>
set注入不同的类型
实体类
public class PersonBean {
private int pid;
private String pname;
private String address;
private CardBean card;
private List<String> ls;
private List<CardBean> cs;
private Map map;
private Properties properties;
<bean name="person,p2,p3" class="com.ujiuye.bean.PersonBean" scope="singleton">
<property name="pid" value="10"/>
<property name="pname" value="张三"/>
<property name="address" value="北京"/>
<!-- ref 引用其他对象-->
<property name="card" ref="cardbean"/>
<property name="ls">
<list>
<value>java</value>
<value>python</value>
<value>c++</value>
</list>
</property>
<property name="cs">
<list>
<ref bean="cardbean"></ref>
<ref bean="cardbean2"></ref>
</list>
</property>
<property name="map">
<map>
<entry>
<key>
<value>name</value>
</key>
<value>admin</value>
</entry>
<entry>
<key>
<value>age</value>
</key>
<value>18</value>
</entry>
</map>
</property>
<property name="properties">
<props>
<prop key="username">root</prop>
<prop key="password">123456</prop>
</props>
</property>
</bean>
<bean name="cardbean" class="com.ujiuye.bean.CardBean">
<property name="cid" value="10"/>
<property name="cnum" value="110"/>
</bean>
<bean name="cardbean2" class="com.ujiuye.bean.CardBean">
<property name="cid" value="10"/>
<property name="cnum" value="110"/>
</bean>
Ioc对于多态的支持
1.创建dao接口 service 中使用dao
2.ServiceImpl
public class CardServiceImpl implements CardService {
private CardDao dao;
public CardDao getDao() {
return dao;
}
public void setDao(CardDao dao) {
this.dao = dao;
}
3.容器
<bean name="cardService" class="com.ujiuye.service.CardServiceImpl">
<property name="dao"
ref="cardDao2"/>
</bean>
<bean name="cardDao1"
class="com.ujiuye.dao.CardDaoImpl1"/>
<bean name="cardDao2"
class="com.ujiuye.dao.CardDaoImpl2"/>
Dao
连接数据库进行增删改查的 sql
接口 实现类放sql
Mybatis 帮你写好了实现类
Service 业务层 可能很复杂,有可能要涉及到多张表的操作,直接到dao里面增删改查的方法即可
原文:https://www.cnblogs.com/masterhxh/p/12918794.html