1. Spring标签
@Repository:持久层,用于标注数据访问组件,即DAO组件。
@Service:业务层,用于标注业务逻辑层主键。
@Controller:控制层,标识一个该类是Spring MVC controller处理器,用来创建处理http请求的对象.
@Component:当你不确定是属于哪一层的时候使用。
@RestController :Spring4之后加入的注解,原来在@Controller中返回json需要@ResponseBody来配合,如果直接用@RestController替代@Controller就不需要再配置@ResponseBody,默认返回json格式。
@Autowired:用来装配bean,都可以写在字段上,或者方法上。默认情况下必须要求依赖对象必须存在,如果要允许null值,可以设置它的required属性为false
@RequestMapping
类定义处: 提供初步的请求映射信息,相对于 WEB 应用的根目录。
方法处: 提供进一步的细分映射信息,相对于类定义处的 URL。
2. 非注解Spring
配置beans.xml
```
```
获取bean:
```
applicationContext = new ClassPathApplicationContext(XmlPath);
applicationContext.getBean(id);
```
3. 注解
1. 创建注解配置类
注解标签用@Configuration,告诉Spring容器这是一个配置类
2. 注册组件(配置类中)
可以创建一个返回值为所需组件类的方法,在方法中直接返回一个组件对象。并且用标签@Bean注解,目的是告诉Spring容器注册一个Bean;
bean默认id为方法名
在Spring容器启动时,容器就会自动调用@Bean标签注解的方法,创建一个组件对象,默认id为方法名,与非注解方式是一致的。
```
@Configuration
public class MainConfig {
@Bean
public User getUser() { return new User("zhansan",15); }
}
```
3. 获取Bean
```
ApplicationContext ac = new AnnotationConfigApplicationContext(配置类);
ac.getBean(组件类);(例如Person.class)
```
这是获取到的就是在config类中注册的bean
可以用ac.getBeanNameForType()组件bean类的id
```
public static void main(String[] args) {
ApplicationContext applicationContext =new AnnotationConfigApplicationContext(MainConfig.class);
User user = applicationContext.getBean(User.class);
System.out.println(user.toString());
}
```
4. 包扫描方式
非注解方式:在bean.xml中配置
只要标注了@Controller、@Service、@Component、@Repository都会被自动扫描,然后加入Spring容器中
注解方式:在配置类中,类声明之前,添加注解标签@ComponentScan(value = "想要扫描的包名")
在标签中也可以设置只包含或者不包含那些类。
在配置完包扫描之后,可以写一个test类测试一下:
用方法ac.getBeanDefinationNames();获取容器中所有bean的names,答应出来就可以看到容器中的所有bean的name
其实@Controller、@Service、@Component、@Repository标签标注的类都是Component
```
@org.junit.Test
public void test01(){
ApplicationContext applicationContext =new AnnotationConfigApplicationContext(MainConfig.class);
String[] names = applicationContext.getBeanDefinitionNames();
for(String s : names)
{
System.out.println(s);
}
}
```
5. 单实例和多实例
单实例singleton:在创建容器之后就会自动调用方法,创建对象并放在容器中。以后每次获取组件都是在容器中拿,是同一个对象
多实例prototype:再创建容器之后并不会直接调用方法创建对象,而是创建之后要获取对象时,才调用方法产生对象。
6. 懒加载(针对单实例·)
对单实例bean来说,默认在容器时创建对象
但是懒汉模式,在启动时并不创建对象,在第一次获取bean对象时创建对象
7. @Cnditional
此标签可以标注类,也可以标注方法;可以控制组件在特定条件下,导入不同的bean
需要:在condition类中实现Conditional接口,并且重写boolean matches方法。
使用:在标注@Cnditional时候,要给出相应的condition类。即在什么条件成立时,产生什么bean对象。
8. import快速导入组件
(1) 只需要在配置类声明之上添加标签@Import(要添加的bean的类名.class)
导入多个:@Import({要添加的bean的类名.class, 另一组件类名.class.....})
id默认是组件在项目中的路径全类名。
(2) ImportSelector
使用:Selector类要实现ImportSelector接口,重写selectImports方法,返回一个String数组,就是要导入的bean的全类名;然后在@Import(要添加的bean的类名.class)标签中,加入selector类.class.
这样就可以导入所需要的bean对象了
(3) ImportBean
使用:实现ImportBeanDefinitionRegistrar接口,并且重写void registerBeanDefinitions方法;与selector相似,类.class也要加进import标签中。
(4) FactoryBea工厂bean
继承FactoryBean
添加要实现的方法