总结
代码这东西,思想最重要,从实践开始,基于实践思考。最终作用于实践
理论部分
依赖注入:DI(Dependency Injection)。分为两部分解释
- 依赖:A类如果需要使用B类,那么A依赖于B
- 注入:类似于医院的注射一样
依赖注入的意思简单就是,将B的引用传入到A。(A可以自己new一个B,但是注入就是外部构造一个B再传入A
控制反转:IOC(Inversion of Control)。将资源控制权交给第三方管理,通常我们是A需要B,A是需求方,B是提供方,直接交易。但是IOC容器就是一个中介,代为管理和分配。
需求方A——卖家
提供方B——卖家
IOC——中介
控制反转依赖于(基于)DI,没有DI就没有IOC
以上都是思想,最终实现千姿百态,我选择的是目前极具代表性的Spring框架
对于属性的赋值,我把他们分为手动控制与控制反转
手动控制
最常见的方法:直接new
private A a=new A();
耦合度极高,静态。修改困难,需要重新编译打包
简单工厂模式
//使用
private BookDao bookDao = DaoFactory.getInstance().createDao("zhongfucheng.dao.impl.BookDaoImpl", BookDao.class);
//工厂类
public class DaoFactory {
private static final DaoFactory factory = new DaoFactory();
private DaoFactory(){}
public static DaoFactory getInstance(){
return factory;
}
public <T> T createDao(String className,Class<T> clazz){
try{
T t = (T) Class.forName(className).newInstance();
return t;
}catch (Exception e) {
throw new RuntimeException(e);
}
}
}
耦合度降低,通过传入字符串信息进行动态加载,但依然是静态
因此将其变种,字符串信息从配置文件读取,实现动态、运行时修改。
自动注入
Spring简单入门
主要讲讲基本的概念
两种IOC容器
- BeanFactory
- XmlBeanFactory:基于BeanFactory,代表角色-ApplicationContext。看名字便知道,这个类就是从xml中加载配置。(就像我上面说的工厂类及其变种)
XmlBeanFactory两个配置文件加载方式
FileSystemXmlApplicationContext
ClassXmlAplicationContext
~注:classpath既存放.class
文件的地方
注入方式
- 通过构造函数
- 通过set方法给属性注入值
- p名称空间
- 自动装配(了解)
- 注解
ApplicationContext简介
如何加载ApplicationContext.xml
public class App {
public static void main(String[] args) {
// 创建容器对象
//ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
ApplicationContext ac=new FileSystemXmlApplicationContext("DemoSpring/applicationContext.xml");
//得到service对象
UserService userService = (UserService) ac.getBean("userService");
userService.save();
}
}
他相当于一个容器,因此根节点是<beans>
二级节点是<bean>
,豆荚和豆子的关系。
注册一个bean
<!--创建userDao对象-->
<!--id表示标识,class标识需要加载的类-->
<bean id="userDao" class="UserDao"/>
如何注入
构造函数注入
<!--创建userService对象-->
<bean id="userService" class="UserService">
<!--要在userService中用userDao,必须先创建userDao-->
<!--构造器配置,index表示第几个参数,name表示参数名,ref表示注入对象,在bean里面选-->
<constructor-arg index="0" name="userDao" ref="userDao"/>
</bean>
setter()
注入
<bean id="userService" class="UserService" >
<!--要在userService中用userDao,必须先创建userDao-->
<!--构造器配置,index表示第几个参数,name表示参数名,ref表示注入对象,在bean里面选-->
<property name="userDao" ref="userDao"/>
</bean>
- 引用类型使用ref属性
- 基本类型使用value属性
p命名空间
<bean id="userService" class="UserService" p:userDao-ref="userDao"/>
ide会自动在<beans>
添加
<beans xmlns:p="http://www.springframework.org/schema/p" />
自动装配
通过setter()
进行装配,而不是构造器
两种形式
- byName
- byType
<bean id="userService" class="UserService" autowire="MODE">
全局自动化
<beans default-autowire="MODE"/>
注解
用注解记得先扫描,如果没有扫描,那么所有注解都是失效的
<!--扫描-->
<beans><context:component-scan base-package="com"/></beans>
@AutoWired
- 可以在构造器上修饰
- 也可以在setter方法上修饰
- 来自java的@Inject的和
@AutoWired
有相同的功能
实践部分
移步:GitHub
网友评论