spring是一种容器管理框架。
| 版本问题
一定要注意每个依赖(jar)的版本。
看评论之后,再运行相关代码。
| IoC(控制反转)/DI依赖注入
Spring 中的所管理的东西都被称为组件。
| 当组件被Spring管理之后,该如何实现注入?有几种方法?
一共三种方法;
1.通过构造方法。
2.通过set方法。
3.通过接口注入。
小结;
首先spring指的是一种容器管理框架,其中的核心概念之一是IOC(控制反转)/DI(依赖注入),该概念需要从依赖注入着手理解,首先是注入两个字,那么首先要解决的问题便是啥是注入?简单理解就是机器a要运行,内部要用到机器b,那么把机器b放到机器a的过程便是注入。紧着的问题便是在哪注入?还是上述例子,就是机器a中声明(这个机器a便是java项目中的类),那么问题就又来了注入是个动词,那么它的宾语什么呢?可以看出它的宾语是 依赖。什么又是依赖呢?上述例子中的机器b便是 依赖,显而易见依赖其实对应的也是java中的类。
那么我们要学的重点便都在这个动词上了。怎么注入呢用 spring?
在注入之前我们要配置spring的aplication.xml文件。
其中的最重要的一个标签。便是组件标签<bean> ,我们需要用此标签来注册组件。写法如下;
其中是有三种解决方法;
1.构造器注入;
首先被注入的类中要声明的有依赖类型的属性。
其次要创建有参的构造器,该构造器中的参数需要是依赖类型数据。
java类中;
----------------------------------------
private GoodDao goodDao;
public GoodService(GoodDao goodDao){
this.goodDao=gooDao;
}
----------------------------------------
aplication.xml文件;
-------------------------------------
//id 其实是类名,但是首字母要小写。 //要被注册为组件的全类名。
<bean id="goodDao" class="com.oracle.dao.GoodDao" >
</bean>
<bean id="goodService" class="com.oracle.srevice.GoodService">
<Constructor name="goodDao" ref="goodDao">
</Constructor>
</bean>
2.set方法注入;
首先要声明一个依赖类型的属性,
次之对其创建一个get和set方法(其实只需要set方法即可)。
java类中;
----------------------------------------
private GoodDao goodDao;
public void setGoodDao(GoodDao goodDao){
this.goodDao;
}
public GoodDao getGoodDao(){
return goodDao;
}
----------------------------------------
aplicationContext.xml文件;
-------------------------------------
//id 其实是类名,但是首字母要小写。 //要被注册为组件的全类名。
<bean id="goodDao" ref="com.oracle.dao.GoodDao" >
</bean>
<bean id="goodService" ref="com.oracle.srevice.GoodService"
<property name="goodDao" ref="goodDao"></property>
</bean>
3.接口注入;
| 用Spring生成对象
//启动Spring容器,在Spring容器启动时会通过配置文件注册信息
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
//获取被管理的的组建的实例对象
context.getBean(GoodService.class); //两种方式: 1. 通过数据类型的字节码文件反射获取,2.通过指定的名称获取。
----------------------------------
注入方式常用的是set注入
java中的接口是可以多实现的,添加一个接口,可以对一个接口提供不同实现。
Spring容器;
Spring托管组件时会创建一个容器进行装载 每个bean。
spring在注册时,是通过类型和名称两种方式注册的,上述两种方式都能找得到对应的组件。
@service ----业务层注解
@Repository ------持久层
@Autowired ---- 自动注入 默认按照类型
---不需要在设置set方法
@Qualifier(value="gd")
--- 通过名称的方式注入(在依赖的注释赋值上名称)
@Resource --默认按照名称做注入
写法 -- @Resouce(name="goodDao")
通过反射获取实体类
@Primary 主要注入 (在多个接口实现类,以防止出现冲突,不用根据名称,根据类型就可以找到对应的实体类)
知识小结
下午主要学习了spring框架是如何使用 注解 的方式实现 依赖注入 的。上午我们已经学习了如何用xml文件配置依赖的注入。 那么如果使用注解的话,我们该如何配置呢?首先我们要知道注解是什么?注解也是一种配置方式,通常是在要被注解的类或者其他类型的上一行。 首先第一个dao层的注解之一, @Repository 声明此dao类是可以被注入的(默认以数据类型的方式注入),然后是service层的注解 @service ,声明此service类是要被注入依赖的类,然后在该类中要被注入依赖的接受属性上方添加 @Autowired 注解,其用意是指用来接收要被注入依赖的。 然后就可以通过调用ApplicatonContext对象的getBean方法获取对象(通过上方的注解配置后,都是以数据类型的方式来实例话对象的)。如果想要通过名称来找的话,只需要把要被实例化的类名首字母小写,其它不变,以字符串的形式填入getBean的参数中即可达到上述效果。
如果要自定义名称的话,有以下思路,首先通过名称找到service层的类,那么就需要修改service注解为 @service("service名") 。即可通过该名称进行实例化数据。然后通过名称注入依赖的话,可以在 @Autowired 的注解之下添加一个 @Qualifier(value =“依赖类名首字母小写”) ,如果写的是其他名称的话,同样要修改dao层依赖上方的注解@Repository为 @Repository("不是默认类名") 。然后还有一点要说的是,在要接收依赖的属性的注解还可以用 @Resource(name="非默认名称") ,此注解默认通过名称进行依赖注入。
最后,就是要说的是通过接口注入了,首先接收依赖的数据类型是对应的接口类型,那么要对指定的依赖进行注入的话,需要修改接收依赖的属性之上添加@Autowired和 @Qualifier(value =“指定要注入的默认类名”),还可以通过在要被注入的依赖上方添上@Primary
@Controller 控制层注解
当不能区分领域是使用下面的注解
@Component 公用的