开发步骤:
- 导包
- 写实现类
- 创建applicationContext.xml
- 配置bean
- 加载配置文件运行
Bean标签
- id,getBean时的唯一标识
- class,全类名
- scope,singleton(单例随容器创建销毁),prototype(getBean时创建,GC机制来销毁),还有三个取值暂不看
- init-method,对象创建时执行对象的某个方法
- destroy-method,对象销毁时执行对象的某个方法
Bean对象的三种创建方式
- 无参构造,最常用,需要一个无参构造方法
- 工厂静态,class属性配置工厂的全类名,factory-method配置工厂的静态方法,getBean得到的是该方法返回的对象
- 工厂实例,首先为工厂配置一个bean标签,然后配置一个想要对象的bean标签该标签不配置class属性,配置factory属性,值为工厂标签的id值,并配置factory-method为工厂返回对象的普通方法
依赖注入
体现的一种方式就是controll层、service层、dao层中的体现。dao和service的实现类都交给ioc管理,service通过getBean获取dao,controll通过getBean获取service,controll只需要service这样就算是硬编码,依赖注入直接把dao注入到service中,不需要在从service中硬性获取,降低耦合性。
在service中声明一个dao对象,然后写它的set方法,在xml文件中service的bean标签声明一个子标签property,name取值规则是(setUserDao,那么name的值为userDao),ref属性为userDao的bean标签的id值
p-命名空间注入(了解即可)
property的一种简单实现。
直接给bean添加属性,如果注入的是对象,p:userDao-ref=“userDao的id”。
依赖注入的类型
- 引用数据
- 普通数据
- 集合数据
基本配置图
Spring的API
ApplicationContext
- ClassPathXmlApplicationContext,从类的根路径下加载配置文件
- FileSystemXmlApplicationContext,从磁盘路径上加载配置文件
- AnnotationConfigApplicationContext,使用注解配置容器对象时,需要用它来创建spring容器,它用来读取注解
getBean方法使用
一种通过id获取,另一种通过Class文件类型获取。
如果容器中存在多个bean的class类型一致,那么第二种方式会报错。
Spring的properties文件引入
将beans的命名空间复制一份,把其中的beans全都改成context即可,引入如下,使用${key}
Spring原始注解
1-4是bean标签配置简化,5-8是依赖注入,9是scope,10是initmethod,11是destorymethod
注解的使用需要使用组件扫描,在applicationContext.xml中配置
//组件扫描的作用是告诉Spring在相应包下找注解并根据注解创建对象等工作
<context:component-scan base-package="基本包名" />
Component 表示该组件用于Spring生成一个bean ->Component:组件
@Component("user")
Controller 表示该控制器用于Spring生成一个bean
@Controller("user")
Service 表示该业务逻辑类用于Spring生成一个bean
@Service("user")
Repository 表示该Dao类用于Spring生成一个bean ->repository:贮藏室 数据封装基地
@Resipotory("user")
Autowired 表示自动封装该属性,或者字段(可以省略set方法,根据字段Field即可,如果该字段是一个Bean,将通过Spring容器中查找该类型的Bean对象,用于封装该注解字段),
@Autowired 根据该注解指定的字段,查询Spring容器中对应的bean对象,分配给当前类作为成员.
Autowired默认是根据类型依赖注入.ByType,如果Autowired注解的是一个字段,并不能完整的体现面向对象的思想,最好是注解在set方法上.
Qualifier 表示根据提供的修饰语 @Qualifier('xxx') -> 匹配该xxx属性,若要使用该注解,必须配合AutoWire一起使用,而Autowire可以单独使用
@Autowire @Qualifier("user") 封装user注解的bean为本类对象的成员,根据名称注入 ByName,设置在字段上. @Qualifier常常使用在参数的赋值上
如: String getUsername(@Qualifier("user")User user){}
Resource 是Aotuwire注解和Qualifier注解的结合体.@Resource("user"),标注为user的bean
@Resource("user") 封装user注解的bean为奔雷对象的成员 == @Autowire @Qualifier
默认根据名称依赖注入,默认Resource() = Resource like Resource(name = "XXX") ->体现面向对象思想应该设置在字段上
可以手动设置为根据类型注入Resource(type = User.class) ->体现面向对象思想应该设置在set方法上
Value @Value("xxx");为修饰的字段赋值;通常配合SpEL(Spring Expression Language)使用
@Value("${jdbc.url}") private String url; 为url赋值 -> (Spring中引入的properties后缀文件中的jdbc.url对应的值)
->或者{PropertySrouce注解中的jdbc.url值}
Scope 常用 : @Scope("singleton") 声明从spring容器获得的该类的bean有且只有一个(单例模式)
@Scope("prototype") 声明从spring容器获得的该类的bean有多个(标准Bean模式)
PostConstruct 注解使用在用户定义的初始化方法前,声明该方法是该类的初始化方法@PostConstruct :意为执行在构造方法后,构造方法创建对象,对象调用该初始化方法
PreDestroy 注解使用在用户自定义的结束方法前,声明该方法是该类的结束方法,当前对象被销毁前调用该方法@PreDestroy ;Spring容器被销毁的时候,执行.
Order 注入对象引用的集合的时候使用:@Order(1) @Order(2) 表示该类生成的bean将会存储在某个List<该类型>中,并按照顺序插入List
如果是Map<String,T> 那么order的顺序没有任何关系,但是该Map必须定义为<String,T> String接收对应对象的id值(id唯一 -> key唯一);
此处的List和Map可以通过@Autowired或@Resource注入;
for example -> UserDao -> UserDaoImpl1(@Repository("userDao1") @Order(2)) and UserDaoImpl2(@Repository("userDao2") @Order(1))
(@Resource)private List<UserDao> list; -> list.get(0) ->userDao2 list.get(1) -> userDao1
(@Autowired)private Map<String,UserDao> map; -> map{第一个("userDao1" = userDao1), 第二(个"userDao2" = userDao2)}
https://www.cnblogs.com/xiaoxi/p/5935009.html 理解spring注解特别好的一篇博客,建议浏览
Spring新注解
产生原因:原始注解无法满足完全替换xml的需求
常针对以下标签使用:
Spring新注解的使用示例:
https://www.cnblogs.com/xuweiweiwoaini/p/11728996.html