Spring学习笔记_IOC
Spring简介
1, 只用IOC
spring.jar , jarkata-commons/commons-loggin.jar
2,IOC容器
实例化具体bean
动态装配
3,AOP支持
安全检查
管理transaction
Spring配置
1,注入类型
- setter(重要)
- 构造方法(可以忘记)
- 接口注入(可以忘记)
<bean id="u" class="com.bjsxt.dao.impl.UserDAOImpl"><!-- new UserDAOImpl()--></bean><bean id="userService" class="com.bjsxt.service.UserService"><!-- <property name="userDAO" ref="u" /> setter注入 ,调用setxxx方法--><constructor-arg> <!-- 构造方法注入,需要在UserService里面写构造方法,相当于调用了构造方法--><ref bean="u"/> <!-- 参考了另外一个已经new 的bean--></constructor-arg></bean>
public class UserService {private UserDAO userDAO; public void add(User user) {userDAO.save(user);}public UserDAO getUserDAO() {return userDAO;}public void setUserDAO(UserDAO userDAO) {this.userDAO = userDAO;}public UserService(UserDAO userDAO) {//用于构造方法注入super();this.userDAO = userDAO;} }
2,id vs. name
name可以用特殊字符
<bean name="u" class="com.bjsxt.dao.impl.UserDAOImpl"></bean><bean id="userService" class="com.bjsxt.service.UserService"><!-- <property name="userDAO" ref="u" />--><constructor-arg><ref bean="u"/></constructor-arg></bean>
3,简单属性的注入
bean name="userDAO" class="com.bjsxt.dao.impl.UserDAOImpl"><property name="daoId" value="8"></property><property name="daoStatus" value="good"></property></bean>
public class UserDAOImpl implements UserDAO {private int daoId;private String daoStatus;public int getDaoId() {return daoId;}public void setDaoId(int daoId) {this.daoId = daoId;}public String getDaoStatus() {return daoStatus;}public void setDaoStatus(String daoStatus) {this.daoStatus = daoStatus;}public void save(User user) {System.out.println("user saved!");}@Overridepublic String toString() {return this.daoId + ":" + this.daoStatus;} }
4,bean 中的scope属性
singleton:只有一个
prototype:每一个都不同
5,集合注入
很少用,不重要!
public class UserDAOImpl implements UserDAO {/* (non-Javadoc)* @see com.bjsxt.dao.UserDAO#save(com.bjsxt.model.User)*/private Set<String> sets;private List<String> lists;private Map<String , String> maps;public Set<String> getSets() {return sets;}public void setSets(Set<String> sets) {this.sets = sets;}public List<String> getLists() {return lists;}public void setLists(List<String> lists) {this.lists = lists;}public Map<String, String> getMaps() {return maps;}public void setMaps(Map<String, String> maps) {this.maps = maps;}public UserDAOImpl() {}public void save(User user) {System.out.println("user saved!");}@Overridepublic String toString() {return "sets size:" + sets.size() + "| lists size:" + lists.size() + "| maps size:" + maps.size() ; }}
<bean name="userDAO" class="com.bjsxt.dao.impl.UserDAOImpl"><property name="sets"><set><value>1</value><value>2</value></set></property><property name="lists"><list><value>1</value><value>2</value><value>3</value></list></property><property name="maps"><map><entry key="1" value="1"></entry><entry key="2" value="2"></entry><entry key="3" value="3"></entry><entry key="4" value="4"></entry></map></property></bean><bean id="userService" class="com.bjsxt.service.UserService"><!-- <property name="userDAO"><ref bean="userDAO"/></property>--><constructor-arg><ref bean="userDAO"/></constructor-arg></bean>
6,自动装配
- byName
- byType
- 如果所有的bean都用同一种,可以使用beans的属性:default-autowire
<bean name="userDAO" class="com.bjsxt.dao.impl.UserDAOImpl"><property name="daoId" value="1"></property></bean><bean name="userDAO2" class="com.bjsxt.dao.impl.UserDAOImpl"><property name="daoId" value="2"></property></bean><bean id="userService" class="com.bjsxt.service.UserService" scope="prototype" autowire="byName"><!-- 未指定property, 若是byname则自动匹配name等于userDAO的bean, 若是bytype则匹配类型为userDAO的bean--></bean>
public class UserDAOImpl implements UserDAO {private int daoId;public int getDaoId() {return daoId;}public void setDaoId(int daoId) {this.daoId = daoId;}public void save(User user) {System.out.println("user saved!");}@Overridepublic String toString() {return "daoId=" + daoId;}}
7,生命周期
- lazy-init (不重要) 容器初始化时(ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml")),不初始化,只有用到时才初始化
<bean id="lazy" class="com.foo.ExpensiveToCreateBean" lazy-init="true"/>
- init-method destroy-methd 不要和prototype一起用(了解)
<bean id="userService" class="com.bjsxt.service.UserService" init-method="init" destroy-method="destroy" scope="singleton"><!-- <property name="userDAO" ref="u" />--><constructor-arg><ref bean="u"/></constructor-arg></bean>
public class UserService {private UserDAO userDAO; public void init() {System.out.println("init");}public void add(User user) {userDAO.save(user);}public UserDAO getUserDAO() {return userDAO;}public void setUserDAO(UserDAO userDAO) {this.userDAO = userDAO;}public UserService(UserDAO userDAO) {super();this.userDAO = userDAO;}public void destroy() {System.out.println("destroy");} }
8,Annotation第一步:
修改xml文件,参考文档<context:annotation-config />
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-2.5.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-2.5.xsd"><context:annotation-config /> <bean id="u" class="com.bjsxt.dao.impl.UserDAOImpl"></bean><bean id="u2" class="com.bjsxt.dao.impl.UserDAOImpl"></bean><bean id="userService" class="com.bjsxt.service.UserService" ></bean></beans>
9,@Autowired(自动装配)
- 默认按类型by type
- 如果想用byName,使用@Qulifier
- 写在private field(第三种注入形式)(不建议,破坏封装)
- 如果写在set上,@qualifier需要写在参数上
public class UserService {private UserDAO userDAO; public void init() {System.out.println("init");}public void add(User user) {userDAO.save(user);}public UserDAO getUserDAO() {return userDAO;}@Autowiredpublic void setUserDAO(@Qualifier("u") UserDAO userDAO) {this.userDAO = userDAO;}public void destroy() {System.out.println("destroy");} }
10,@Resource(重要)
- 加入:j2ee/common-annotations.jar
- 默认按名称,名称找不到,按类型 @Resource
- 可以指定特定名称 @Resource(name="u2")
- 推荐使用
- 不足:如果没有源码,就无法运用annotation,只能使用xml
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-2.5.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-2.5.xsd"><context:annotation-config /><bean id="userDAO" class="com.bjsxt.dao.impl.UserDAOImpl"></bean><bean id="u2" class="com.bjsxt.dao.impl.UserDAOImpl"></bean><bean id="userService" class="com.bjsxt.service.UserService" ></bean></beans>
public class UserService {private UserDAO userDAO; public void init() {System.out.println("init");}public void add(User user) {userDAO.save(user);}public UserDAO getUserDAO() {return userDAO;}@Resource(name="u2")//@Resourcepublic void setUserDAO( UserDAO userDAO) {this.userDAO = userDAO;}public void destroy() {System.out.println("destroy");} }
11,@Component @Service @Controller @Repository 在spring2.5.6中 这四个目前没有区别
- 初始化的名字默认为类名首字母小写
- 可以指定初始化bean的名字 @Component("u")
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-2.5.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-2.5.xsd"><context:annotation-config /><context:component-scan base-package="com.bjsxt"/> </beans>
@Component("u") //u=new UserDAO() public class UserDAOImpl implements UserDAO {public void save(User user) {System.out.println("user saved!");}}
@Component("userService") public class UserService {private UserDAO userDAO; public void init() {System.out.println("init");}public void add(User user) {userDAO.save(user);}public UserDAO getUserDAO() {return userDAO;}@Resource(name="u") //把name=u的UserDAO注入public void setUserDAO( UserDAO userDAO) {this.userDAO = userDAO;}public void destroy() {System.out.println("destroy");} }
12,@Scope
13,@PostConstruct = init-method; @PreDestroy = destroy-method;
@Scope("singleton") @Component("userService") public class UserService {private UserDAO userDAO; @PostConstructpublic void init() {System.out.println("init");}public void add(User user) {userDAO.save(user);}public UserDAO getUserDAO() {return userDAO;}@Resource(name="u")public void setUserDAO( UserDAO userDAO) {this.userDAO = userDAO;}@PreDestroypublic void destroy() {System.out.println("destroy");} }
转载于:https://www.cnblogs.com/enjoy-life-clh/p/4227485.html
Spring学习笔记_IOC相关推荐
- 【Spring学习笔记-MVC-13.2】Spring MVC之多文件上传
作者:ssslinppp 1. 摘要 前篇文章讲解了单文件上传<[Spring学习笔记-MVC-13]Spring MVC之文件上传>http://www.cnblogs.co ...
- Spring学习笔记(三) AOP_annotation,AOP_XML
在学习课程以前,听说AOP有种很神秘的感觉,好像很好深的技术.其实原理很简单,使用动态代理的方式给程序增加逻辑.与此相似的有struts2中的filter拦截器. 再讲AOP之前先把需求说一下: 同S ...
- spring学习笔记06-spring整合junit(出现的问题,解决的思路)
spring学习笔记06-spring整合junit(出现的问题,解决的思路) 文章目录 spring学习笔记06-spring整合junit(出现的问题,解决的思路) 3.1测试类中的问题和解决思路 ...
- spring学习笔记01-BeanFactory和ApplicationContext的区别
spring学习笔记01-BeanFactory和ApplicationContext的区别 BeanFactory 和 ApplicationContext 的区别 BeanFa ...
- spring学习笔记02-spring-bean创建的细节问题
spring学习笔记02-spring-bean创建的细节问题 三种创建Bean对象的方式 Bean的作用范围 Bean的生命周期 <?xml version="1.0" e ...
- spring学习笔记03-spring-DI-依赖注入详解(通过xml配置文件来配置依赖注入)
spring学习笔记03-spring-DI-依赖注入详解 1.概念 2.构造函数注入 3.set方法注入 4.集合的注入 需要被注入的实体对象 package com.itheima.service ...
- Spring学习笔记:配置单数据源
Spring学习笔记:配置单数据源 一.Spring Boot默认数据源类型 Springboot默认支持4种数据源类型,定义在 org.springframework.boot.autoconfig ...
- Spring学习笔记:第一个Spring Boot程序HelloWorld
Spring学习笔记:第一个Spring Boot程序HelloWorld 一.跟着 Spring 了解技术趋势 1.看看 Spring 5.x 的改变暗示了什么 2.Spring Boot 和 Sp ...
- Spring学习笔记之MyBatis
系列文章目录 Spring学习笔记 之 Springhttps://blog.csdn.net/weixin_43985478/article/details/124411746?spm=1001.2 ...
最新文章
- Eigen向量化内存对齐/Eigen的SSE兼容,内存分配/EIGEN_MAKE_ALIGNED_OPERATOR_NEW
- ​cglib实现动态代理构建带参数的代理实例
- python3 字符串前面加上'r'的作用
- WPF and Silverlight 学习笔记(十八):WPF样式(Style)与模板(Template)
- C++虚函数实现多态的机制
- 以太坊测试链环境node.js版本
- 【剑指offer】5.二叉树的镜像和打印
- Android多点触摸 与 手势识别
- 矩阵论10,11,12作业
- 安装 ActiveState Perl
- 完成网络传真,网络扫描。
- [已解决] Could not create connection to database server.
- 【19调剂】东北林业大学森林工程邢艳秋老师调剂信息
- ssm基于jsp高校选课系统毕业设计源码291627
- 英语语法总结--虚拟语气
- 华为2012实验室无线通信领域的首席专家朱佩英博士
- 斐讯db2_斐讯P1刷armbian变身linux小型服务器
- 卫星地图哪个最清晰,哪个使用最方便? 附赠全套可用图源
- 互联网日报 | 7月16日 星期五 | 美团打车宣布新司机7天免佣;小米手机销量超苹果首次居全球第二;北大成立集成电路学院...
- “80后”的二代身份证该换了!
热门文章
- 本地打包Docker镜像上传至阿里云远程仓库(一站式脚本)
- 基于Golang的对象序列化的程序包开发——myJsonMarshal
- 2022-2028年中国钢轨探伤车行业市场研究及前瞻分析报告
- liunx上mysql源码安装mysql,搞定linux上MySQL编程(一):linux上源码安装MySQL
- 2022-2028年中国复合软管行业市场行情动态及发展趋向分析报告
- CentOS 6.5 下配置Java环境
- 【微服务架构】SpringCloud之Eureka入门篇
- tableau问题汇总
- jieba分词流程及部分源码解读(一)
- 单步调试 step into/step out/step over 区别