1 入门程序
1.1 创建实体类
@Component()
public class TUser {
private String name;
private String sex;
private Integer age;
private Date brithday;
private IdCard idcard;
private List<String> product;
private Set<String> product2;
//省略其他
}
1.2 修改配置文件
- 约束条件
- 声明扫描范围
<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/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="com.yiwu.pojo"/>
1.3 测试方法
import com.yiwu.pojo.TUser;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MyTest01 {
public static void main(String[] args) {
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext(" applicationContext.xml");
TUser tuser = (TUser)applicationContext.getBean("TUser");
System.out.println(tuser);
System.out.println(aaa("UTser"));
}
}
1.4 声明注解细节
@Component注解细节
- 类的注解,声明此类被Spring容器进行管理,相当于bean标签的作用
- @Component(value=“类的别名”) value属性用于制定当前bean的id属性,或者叫别名。
- value属性也可以省略,若省略有以下两种情况:
- 一般情况别名为当前类名首字母改小写,其他字母大小写不变。
- 若前类名两个字母都为大写,则别名为原类名。(参考源码)
@Controller、@Service、@Repository
-
这三个注解也可以将类声明给Spring管理,他们主要是语义上的区别
-
@Controller注解主要声明将控制器类配置给Spring管理,例如Servlet
-
@Service注解主要声明业务处理类配置给Spring管理,Service接口的实现类
-
@Repository注解主要声明持久化类配置给Spring管理,DAO接口
-
@Component除了控制器,Service,DAO之外的类一律使用此注解声明
2 单例/多例模式
@Scope()
-
类注解,用于声明当前类单例模式还是非单例模式,相当于bean标签的scope属性
-
@Scope(“prototype”) 表示当前类为非单例模式(默认单例模式)
@Lazy()
- 类注解,用于声明一个单例模式的bean是否为懒汉模式
- @Lazy(true) 表示声明为懒汉模式,默认为饿汉模式
2.1 单例饿汉模式
默认模式
TUser添加注解与无参构造函数。
@Component("tuser")
public class TUser {
private String name;
private String sex;
private Integer age;
private Date brithday;
private IdCard idcard;
private List<String> product;
private Set<String> product2;
public TUser() {
System.out.println("生成对象");
}
}
测试代码
import com.yiwu.pojo.TUser;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MyTest01 {
public static void main(String[] args) {
System.out.println("容器开始初始化");
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext(" applicationContext.xml");
System.out.println("容器初始化完成");
System.out.println("开始获取实例");
TUser tuser1 = (TUser)applicationContext.getBean("tuser");
System.out.println("第一次获取完成");
TUser tuser2 = (TUser)applicationContext.getBean("tuser");
System.out.println("获取实例完成");
System.out.println(tuser1);
System.out.println(tuser2);
}
执行结果
实例在容器初始化的时候生成,每次从容器获取的是同一个实例
容器开始初始化
生成对象
容器初始化完成
开始获取实例
第一次获取完成
获取实例完成
com.yiwu.pojo.TUser@52e677af
com.yiwu.pojo.TUser@52e677af
2.2 单例懒汉模式
TUser添加@Lazy(true)注解
@Component("tuser")
@Lazy(true)
public class TUser {
private String name;
private String sex;
private Integer age;
private Date brithday;
private IdCard idcard;
private List<String> product;
private Set<String> product2;
public TUser() {
System.out.println("生成对象");
}
}
执行结果
实例在第一次获取对象时候生成,之后每次获取的是同一个实例。
容器开始初始化
容器初始化完成
开始获取实例
生成对象
第一次获取完成
获取实例完成
com.yiwu.pojo.TUser@55a1c291
com.yiwu.pojo.TUser@55a1c291
2.3 原型/多例模式
TUser添加@Scope(“prototype”)注解
在该模式下,所有实例都是在获取实例时生成。
@Component("tuser")
@Scope("prototype")
public class TUser {
private String name;
private String sex;
private Integer age;
private Date brithday;
private IdCard idcard;
private List<String> product;
private Set<String> product2;
public TUser() {
System.out.println("生成对象");
}
}
执行结果
容器开始初始化
容器初始化完成
开始获取实例
生成对象
第一次获取完成
生成对象
获取实例完成
com.yiwu.pojo.TUser@5b0abc94
com.yiwu.pojo.TUser@75c072cb
2.4 其他相关注解
@PostConstruct
方法注解,声明一个方法为当前类的初始化方法(在构造器之后执行),相当于bean标签的init-method属性
@PreDestroy
- 方法注解,声明一个方法为当前类的销毁方法(在对象销毁之前执行),相当于bean标签的destory-method属性。
@Autowired
-
属性注解、方法注解(set)声明当前属性自动装配,默认byType,默认必须(如果没有找到类型与属性类型匹配的bean则抛出异常)
-
@Autowired(required = false) 通过required属性设置当前自动装配是否为必须(默认必须——如果没有找到类型与属性类型匹配的bean则抛出异常)
-
@Qualifier(“a”) 通过id(有多个重复类型的情况下用此方法)
@Component("aaa")
public class Clazz {
private Integer id;
private Integer number;
}
@Autowired(required = false)
public void setClazz1(@Qualifier("aaa") Clazz clazz1) {
this.clazz1 = clazz1;
}
@Resource
- 属性注解,也用于声明属性自动装配
- 默认装配方式为byName,如果根据byName没有找到相应的bean,则继续根据byType寻找对应的bean,根据byType如果没找到bean,或者找到不止一个类型匹配的bean则抛出异常。
@Component("clazz1")
public class Clazz {
private Integer id;
private Integer number;
}
@Resource
private Clazz clazz1;