Spring的两大核心是IOC和DI
IOC:控制反转,对象创建的权利交给springApplication容器
DI:依赖注入,注入的是属性
传统意义上创建对象都是new操作。
举个例子:
dao层类:UserDao
service层类:UserService
web(controller)层:UserController
三个层的调用关系为:
web ---> service ---> dao
这样的情况
web层会new一个service层对象
service层会new一个dao层对象
若是其中一个层的代码更改,也会导致其它层的代码也要做相应修改
三个层之间的耦合度很高,不利于代码维护
Spring对于上面的情况采用IOC和DI
IOC:底层实现是工厂模式和java反射机制
DI:依赖注入,有三种方式,构造函数注入,属性注入,set方法注入,多数情况下采用的set方法注入。
Spring实现对象创建有两种方式:xml配置,注解方式
xml配置方式:配置bean很多,个人觉得还是注解方式比较好
xml配置方式:
User类:
属性:name,age
bean的其中一种写法:
属性注入的方式,创建一个User对象,名字和年龄为hahahh,18
<bean id="user" class="com.smart.domain.User" >
<property name="name" value="hahahh" /> <!--property属性,name对应User类里面属性的名字,value表示给属性赋的值,作用等同于setName(String name)方法-->
<property name="age" value="18" />
</bean>
注解方式
1.设置扫描contaxt ,指定扫描的包全路径如:com.smart.domain
2.在不同的类上放置不同的注解,@Repository @Service @Controller 这几个注解的作用都是创建对象用的,没有非要写在哪一层的要求,放在不同的层上只是行业规范
3.domain层@Repository
service层@service
web层@controller
4.controller里面调用的service对象采用@Autowired
@Autowired
private UserService userService;
@Autowired自动注入方式,也有其他注解实现注入
最后总结
控制反转:对象创建的由spring容器来创建,创建的就是xml里面配置的bean
依赖注入: 必须在控制反转的基础上才能进行,是对spring容器创建的对象(bean)属性进行赋值操作,例如对User类里面的name属性进行操作