当前位置: 首页 > 编程日记 > 正文

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

相关文章:

长治学院计算机在哪个校区,长治学院有几个校区及校区地址

最近有很多考生和家长咨询小编&#xff0c;长治学院有几个校区&#xff0c;今年新生会被分配到哪个校区?哪个校区好?等相关问题&#xff0c;下面小编统一回复一下考生们的问题。长治学院有2个校区&#xff0c;分别是南校区、北校区。长治学院校区及地址南校区&#xff1a;山西…

as3垃圾回收机制

as3垃圾回收机制 垃圾回收机制详解 能力越大责任越大&#xff0c;这对actionscript3.0来说一点没错。引入这些新控件带来一个副作用&#xff1a;垃圾收集器不再支持自动为你收集 垃圾等假设。也就是说Flash开发者转到actionscript3.0之后需要对关于垃圾收集如何工作以及如何编程…

opensuse安装nginx

opensuse安装nginx 安装步骤如下 1、sudo zypper install curl ca-certificates gpg2 2、sudo zypper addrepo --gpgcheck --type yum --refresh --check \ http://nginx.org/packages/sles/$releasever nginx-stable 3、sudo zypper addrepo --gpgcheck --type yum --refresh …

Go 分布式学习利器(10)-- Go语言的接口

文章目录1. 接口与依赖2. 自定义类型1. 接口与依赖 在上一节中我们讨论Go语言的面向对象特性的时候也说了&#xff0c;Go语言并不支持继承&#xff0c;能够进行对象的封装&#xff08;包括数据成员和成员函数的封装&#xff09;&#xff0c;那么这里简单说一下Go语言接口之间的…

计算机输入输出有哪几种控制方式,计算机输入/输出的方式有哪几种?

计算机输入/输出的方式有&#xff1a;并行、串行这两种。1、并行并行是指一组程序按独立异步的速度执行&#xff0c;不等于时间上的重叠(同一个时刻发生)。并行也指8位数据同时通过并行线进行传送&#xff0c;这样数据传送速度大大提高&#xff0c;但并行传送的线路长度受到限制…

LoadRunner中log的使用总结

LoadRunner中log的使用总结 1、log的设置方式。在 runtime setting中可以设置log的生成方式&#xff1a;默认的log方式&#xff1a;Enable logging选中&#xff0c;log option是Send messages only when an error occurs.可以修改日志的方式&#xff1a;Always send messages&a…

JavaScript中变量的相互引用

http://www.jb51.net/article/23387.htm转载于:https://www.cnblogs.com/chris-oil/p/3402072.html

mysql-事物

Mysql之事物详解 一、事务定义 事务&#xff1a;一个最小的不可再分的工作单元&#xff1b;通常一个事务对应一个完整的业务(例如银行账户转账业务&#xff0c;该业务就是一个最小的工作单元)一个完整的业务需要批量的DML(insert、update、delete)语句共同联合完成事务只和DML语…

一文入门 Zookeeper

文章目录1. zookeeper 简介1.1 什么是zookeeper1.2 zookeeper 发展历史1.3 zookeeper 典型应用场景1.4 zookeeper 提供的服务1.5 zookeeper的数据模型1.6 znode的分类2. Zookeeper架构2.1 整体架构2.2 session2.3 Quorum 模式2.4 数据一致性3. zookeeper的案例演示3.1 zookeepe…

龙岩学院和三明学院计算机专业,龙岩学院和三明学院哪个比较好?

满意答案lxq051052014.06.27采纳率&#xff1a;51% 等级&#xff1a;7已帮助&#xff1a;459人520的分数算不错了&#xff0c;在择校中可以采取“冲、稳、保、垫”的志愿填报方法&#xff0c;冲的话可以选择漳师、闽江和厦门理工学院&#xff0c;都是不错的选择&#xff0c;…

MySQL 的 find_in_set函数使用方法

很多时候我们在设计数据库时有这种情况,比如: 有个文章表里面有个type字段,他存储的是文章类型,有 1头条,2推荐,3热点,4图文 .....11,12,13等等 现在有篇文章他既是 头条,又是热点,还是图文,type中以 1,3,4的格式存储. 那们我们如何用sql查找所有type中有4图文标准的文章呢,这就…

SCCM符合性设置

符合性设置--可以针对注册表值、脚本、文件系统、补丁更新情况进行符合性检查&#xff0c;除了在报表中查看结果外&#xff0c;还可以在CCM客户端 的 配置 中查看符合性评估结果&#xff0c;适合排错1.配置项目---新建针对 注册表值、脚本、文件系统等的符合性检查规则 …

Java(三):序列化

1、什么是Java对象序列化&#xff1f; Java的对象序列化是将那些实现了Serializable接口的对象转化成一个字节序列&#xff0c;并能够在以后将这些字节序列完全恢复成原来的对象。简单来说序列化就是将对象转化成字节流&#xff0c;反序列化就是将字节流转化成对象。 对象必须在…

Go 分布式学习利器(11)-- Go语言通过单链表 实现队列

一个小实验&#xff0c;将之前学习的Go相关的语法做个总结。 包括&#xff1a; Go语言接口特性Go语言封装特性Go语言 变量&#xff0c;指针&#xff0c;函数 语法GO语言 条件和循环语句 的语法GO语言的测试程序 通过链表实现一个队列&#xff0c;元素在其中 拥有先进先出的特…

最长公共子序列(LCS)问题 Longest Common Subsequence 与最长公告字串 longest common substr...

问题描述&#xff1a;字符序列的子序列是指从给定字符序列中随意地&#xff08;不一定连续&#xff09;去掉若干个字符&#xff08;可能一个也不去掉&#xff09;后所形成的字符序列。令给定的字符序列X“x0&#xff0c;x1&#xff0c;…&#xff0c;xm-1”&#xff0c;序列Y“…

逆战服务器在哪个文件夹,逆战的背景音乐文件夹放在哪?别说在服务器上面!...

满意答案Dim185629442017.01.11采纳率&#xff1a;58% 等级&#xff1a;13已帮助&#xff1a;7224人你右键逆战图标&#xff0c;有个打开文件位置&#xff0c;点开&#xff0c;找就可以了。。 追问&#xff1a; 如果我把我喜欢的音乐文件放进去&#xff0c;我喜欢的音乐会成…

ruby调用java代码

为什么80%的码农都做不了架构师&#xff1f;>>> ruby使用rjb调用java代码 require rjb#加载jar包 Rjb::load(classpath /home/deployer/DmCodec.jar, jvmargs[]) #new一个对象 DmCodec Rjb::import(com.zapya.DmCodec).new #调用实例方法 tmp DmCodec.encodeB6…

VMware虚拟机安装黑苹果MacOS Mojave系统详细教程

更多资源请百度搜索&#xff1a;前端资源网 欢迎关注我的博客&#xff1a;www.w3h5.com 最近遇到一个H5页面的 iPhone X 刘海兼容问题。查到一个 XCode 编辑器&#xff0c;可以模拟 iPhone X 环境运行。 然后发现&#xff0c;XCode 是专门为苹果的 MacOS 系统设计的一款开发工具…

LSM 优化系列(四) -- Rocksdb和Lethe 对Delete问题的优化

文章目录前言1. 问题背景2. 问题复现3. Rocksdb 的 Delete-Aware 优化3.1 可配置的 Delete-Aware调度3.2 Compaction 逻辑对 delete key的优化4. Lethe: A Tunable Delete-Aware LSM Engine . SIGMOD20前言 本文介绍过程中涉及到的源代码是基于rocksdb 6.4.6 版本的。 同时需…

CodeForces Round #287 Div.2

A. Amr and Music (贪心) 水题&#xff0c;没能秒切&#xff0c;略尴尬。 1 #include <cstdio>2 #include <algorithm>3 using namespace std;4 5 const int maxn 100 10;6 int a[maxn], r[maxn], ans[maxn];7 8 int cmp(int i, int j) { return a[i] < a[j]; …

什么叫安装文件索引服务器,搜出精彩 玩转Windows 2008系统心得

【IT168 专稿】不少朋友已经在不经意间与Windows Server 2008系统进行了亲密接触&#xff0c;在一段时间的接触之后&#xff0c;不知大家对该系统的文件搜索功能会有什么样的体会&#xff1f;其实&#xff0c;Windows Server 2008系统的文件搜索功能与以往相比有了很大进步&…

取eclipse console 打印字符串,判断日志是否有异常

2019独角兽企业重金招聘Python工程师标准>>> 1. 取得当前输入的console /*** 取得控制台的字符串的Docment* param processConsoleName 控制台名称&#xff0c;如在java application 中定义的名字为test ,则这个地方的输入为test即可* return null*/public stati…

PAT乙级1028

1028 人口普查 &#xff08;20 分)某城镇进行人口普查&#xff0c;得到了全体居民的生日。现请你写个程序&#xff0c;找出镇上最年长和最年轻的人。 这里确保每个输入的日期都是合法的&#xff0c;但不一定是合理的——假设已知镇上没有超过 200 岁的老人&#xff0c;而今天是…

Go 分布式学习利器(12)-- Go语言的扩展和复用

Go语言无法天然支持继承&#xff0c;但是又想要实现面向对象的特性。 即父类对象 使用子类对象初始化&#xff0c;那么该父类对象调用的函数就是子类实现的函数 &#xff0c;从而满足LSP&#xff08;子类交换原则&#xff09;。 案例一&#xff1a; Go语言 支持扩展父类的功能…

displaytag 导出

只使用displaytag的导出功能&#xff0c;表单展示用jqgrid实现。只需要后台修改一部分代码&#xff0c;其他的表单都能使用这个功能导出。导出四种文件格式&#xff1a;csv&#xff0c;excel&#xff0c;xml&#xff0c;pdf。 思路&#xff1a;在过滤器中处理&#xff0c;过滤器…

两个下拉框相关联ajax,触发第二个下拉框以显示基于从第一个下拉框中选择的值的值ajax...

我有两个引导程序下拉框。当我们点击另一个下拉菜单时&#xff0c;其中一个会根据用户选择的国家显示来自数据库的所有国家名称&#xff0c;另一个下拉菜单应该选择状态。 当我点击一个下拉菜单时&#xff0c;我做了一个ajax请求来显示国家名称。如何根据国家选择触发其他下拉菜…

使用apache服务器配置虚拟目录

安装好了apachephpmysql之后就像在自己电脑上安装wordpress玩玩&#xff0c;因为安装好之后根目录在D盘&#xff0c; 所以就想自己配置一个虚拟目录指向路径为D:\wordpress的wordpress 在httpd.conf中添加虚拟目录之后去访问localhost:88/myblog却出现了403错误&#xff0c;提示…

YARN的HA

拓展&#xff1a;线程与进程的区别 进程是由一个以上的的线程组成的 ps -ef 能出现的就是进程。 YARN HA hadoop001&#xff1a;zk rm(zkfc) nmhadoop002&#xff1a;zk rm(zkfc) nmhadoop003&#xff1a;zk nm ZKFC: 线程 只作为RM进程的一个线程而非独立的进程存在 RMStateSt…

一个复杂的存储过程

首先说明一下我这个存储过程的功能&#xff1a; 根据不同的查询条件组合进行查询数据&#xff0c;数据库中有项目信息表Project 有项目区域表ProjectArea 项目信息表Project和项目区域表的关联是通过ProjectArea和AreaID进行一对一关联&#xff0c;项目区域信息中的信息有所属关…

Go 分布式学习利器(13)-- Go语言的多态

文章目录1. 基本的多态实现2. 空接口与断言3. Go接口的最佳实践1. 基本的多态实现 我们知道C中实现多态是通过虚函数表 和 继承来 实现的。 类似如下代码&#xff1a; class Programmar{ public:virtual void write_hello_world() 0; }class GoProgrammar: public Programma…