<bean id="users" class="com.fz.entity.User" init-method="abc" destroy-method="destory" scope="singleton">
id id值
name 名称
class 指定类
init-method 初始化
destroy-method 销毁
scopy = singleton | prototype 多实例,使用时再实例化对象
lazy-init="true"
</bean>
spring容器使用注解
beans.xml 文件加入关联
<?xml version="1.0" encoding="UTF-8"?>
<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:annotation-config/>
<context:component-scan base-package="com.fz.entity"/>
</beans>
初始化方法
配置方式
init-method="abc" 容器在构造方法完成后,直接执行abc方法
scope="prototype" 如果是多实例,则是每次使用,都要执行构造方法,同时执行初始化方法
scope="singleton" 单例模式,是默认的,是立即装载 都要执行构造方法,同时执行初始化方法
注解方式
package com.fz.entity;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
/**
* Created by webrx on 2017-07-03.
*/
//@Controller("uok")
//@Component("uok")
@Service("uok") //@Scope("prototype")
@Scope("singleton")
@Controller User -> user
userInfo -> userInfo
public class User {
public User(){
System.out.println("构造方法()..");
}
@PostConstruct 初始化方法
public void init(){
System.out.println("init--初始化...");
}
@PreDestroy
public void destory(){
System.out.println("销毁方法");
}
public void show(){
System.out.println("数据显示........");
}
@PostConstruct
public void abc(){
System.out.println("abc..");
}
}
销毁方法
配置方式
destroy-method="destory"
当容器销毁对象时,会自动调用destory方法
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
User u = ctx.getBean("users",User.class);
ctx.close();
注解方式
package com.fz.entity;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
/**
* Created by webrx on 2017-07-03.
*/
//@Controller("uok")
//@Component("uok")
@Service("uok") //@Scope("prototype")
@Scope("singleton")
public class User {
public User(){
System.out.println("构造方法()..");
}
@PostConstruct
public void init(){
System.out.println("init--初始化...");
}
@PreDestroy //销毁方法
public void destory(){
System.out.println("销毁方法");
}
public void show(){
System.out.println("数据显示........");
}
@PostConstruct
public void abc(){
System.out.println("abc..");
}
}
自动装配
<!-- autowire自动装配 简化spring配置
no不使用自动装配
byName 根据名称(set方法名来的)去查找相应的bean,如果有则装配上
byType 根据类型进行自动装配 不用管bean的id.但是同一种类型的bean只能有一个。建议慎用
constructor 当通过构造器 注入 实例化bean时 适用byType的方式 装配构造方法
-->
byName
byType
default-autowire="byName"
<bean id="user" class="com.fz.entity.User" autowire="byType"/>
<bean id="book" class="com.fz.entity.Book">
<property name="id" value="100"/>
<property name="name" value="《计算机编程入门》"/>
</bean>
<bean id="st" class="com.fz.entity.Student">
<property name="sno" value="111"/>
<property name="name" value="李四国"/>
</bean>
<bean id="sts" class="com.fz.entity.Student">
<property name="sno" value="222"/>
<property name="name" value="张三丰"/>
</bean>
<?xml version="1.0" encoding="UTF-8"?>
<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-4.3.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.3.xsd" default-autowire="byName">
<!-- 注解扫描相关包路径 -->
<context:annotation-config/>
<context:component-scan base-package="com.fz.entity"/>
<!-- -->
<!--
<bean id="user" class="com.fz.entity.User">
<property name="book" ref="book"/>
</bean>
-->
<bean id="user" class="com.fz.entity.User"/>
<bean id="book" class="com.fz.entity.Book">
<property name="id" value="100"/>
<property name="name" value="《计算机编程入门》"/>
</bean>
<bean id="st" class="com.fz.entity.Student">
<property name="sno" value="111"/>
<property name="name" value="李四国"/>
</bean>
<bean id="student" class="com.fz.entity.Student">
<property name="sno" value="222"/>
<property name="name" value="张三丰"/>
</bean>
</beans>
注解功能
1)配置spring容器
<?xml version="1.0" encoding="UTF-8"?>
<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:annotation-config/>
<context:component-scan base-package="com.fz.entity"/>
</beans>
2)注解使用
@Component 如果不写,则使用类名小写作为名称
@Component("uuu")
@Data @Component
public class Book {
@Value("100")
private int id;
@Value("《mysql数据库技术》")
private String name;
}
@Autowired 根据类型自动装配
@Autowired //根据类型自动装配 byType
@Autowired @Qualifier("user") //根据名称自动装配 byName
private User user;
@Resource(name="book")
3)注解bean类方法
注解bean类 com.entity.Db类
---------------------------------------------------
@Component("db")
public class Db {
public void show(){
System.out.println("dbshow");
}
}
@Controller("member")
public class Member {
public void save(){
System.out.println("saveok");
}
}
@Service("m")
public class Member {
public void save(){
System.out.println("saveok");
}
}
@Repository("mm")
public class Member {
public void save(){
System.out.println("saveok");
}
}
4)注解单例 多例
---------------------------------------------------
@Repository("mm") @Scope("singleton") 单例默认
public class Member {
}
@Repository("mm") @Scope("prototype") 多实例
public class Member {
}
5)注解初始化方法
import javax.annotation.PostConstruct;
---------------------------------------------------
@PostConstruct
public void a(){
System.out.println("初始化1");
}
@PostConstruct
public void init(){
System.out.println("初始化2");
}
6)注解销毁方法
import javax.annotation.PreDestroy;
---------------------------------------------------
@PreDestroy
public void close(){
System.out.println("退出");
}
@PreDestroy
public void exit(){
System.out.println("销毁");
}
7)属性注入
-------------------------------------------------------
@Data
@Component("book")
@Scope("prototype")
public class Book {
@Value("BS101")
private String bid;
@Value("java书籍")
private String bname;
}
@Data @Repository("mm") @Scope("prototype")
public class Member {
@Resource(name="book") 此处的book 就是指定工厂中的 上的那book名@Component("book")
相当于beans.xml 中的<property name="book" ref="book"></property>
private Book book;
}
win10
@Data @Repository("mm") @Scope("prototype")
public class Member {
@Autowired 根据类型自动注入对象
private Book book;
}
8)延迟加载
-----------------------------------------------------------------
单例模式是默认的,会立即加载 加上@Lazy 不自动加载,第一次使用时再加载
@Data
@Component @Scope("singletone") @Lazy
public class Teacher {
private String name;
public Teacher() {
System.out.println("空构造方法");
}
public Teacher(String name) {
this.name = name;
System.out.println("有参数name的构造方法");
}
public void info(){
System.out.println("老师姓名:"+this.name);
}
}
@Scope("prototype") 多实例,默认使用的使用时加载
@Data @Repository("mm") @Scope("singleton") @Lazy 延迟加载,在第一次使用时加载
public class Member {
}
@Data @Repository("mm") @Scope("singleton") @Lazy(false) 立即加载初始化
public class Member {
}
beans.xml
<beans default-lazy-init="true"> 所有bean都延迟实例化初始化加载
<beans default-autowire="byName">默认注入相关属性对象