Spring学习源码:https://download.csdn.net/download/qq_41505957/20606092
注解开发
@Component注解
首先,使用注解开发需要指定注解扫描包,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
https://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="com.zhang.bean"/>
</beans>
com.zhang.bean
是我用来放实体类的包。
实体类User.java
在实体类上添加@Component注解可以给bean设置id。
@Component("user")
//给bean设置id 相当于<bean id="user" class="com.zhang.bean.User"/>
public class User {
private String name;
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
'}';
}
}
测试方法:
@Test
public void test1() {
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
User user = context.getBean("user",User.class);
System.out.println(user);
}
测试结果:
属性注入
可以直接在属性声明的上面使用@Value注解
public class User {
@Value("张三")
private String name;
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
'}';
}
}
测试结果:
也可以在set方法上使用@Value’注解
@Value("张三")
public void setName(String name) {
this.name = name;
}
Component的衍生注解
@Controller:web层
@Service:service层
@Repository:dao层
@scope
- singleton:默认的,Spring会采用单例模式创建这个对象。关闭工厂 ,所有的对象都会销毁。
- prototype:多例模式。关闭工厂 ,所有的对象不会销毁。内部的垃圾回收机制会回收
@Controller("user")
@Scope("prototype")
public class User {
private String name;
@Value("张三")
public void setName(String name) {
this.name = name;
}
}
使用Java类进行配置
编写实体类,在实体类上添加@Component注解。
@Component//将这个类标注为Spring的一个组件,放到容器中
public class User {
private String name;
}
编写一个类,在上面添加@Configuration注解,表明这是一个配置类,之后可以通过反射获得在这个类中注册的bean。
在类中编写方法,在方法上添加@Bean注解来注册Bean,id为方法名
@Configuration
public class MyConfig {
@Bean
public User javaGetUser(){
return new User("李四");
}
}
之后编写测试类,注意这个测试类和前面的类有所不同,所创建的对象不同,而且参数使用了配置类的反射。
@Test
public void test1() {
ApplicationContext context = new AnnotationConfigApplicationContext(MyConfig.class);
User user = context.getBean("javaGetUser",User.class);
System.out.println(user);
}
测试结果:
导入其他配置
@Configuration //代表这是一个配置类
public class MyConfig2 {
}
@Import + 想要导入配置类的反射
@Configuration
@Import(MyConfig2.class) //导入合并其他配置类,类似于配置文件中的 inculde 标签
public class MyConfig {
}