通过反射来创建对象,避免通过new关键字
读取配置文件来获取要创建的对象的全限定类名(唯一标志)
持久层
持久层接口
持久层实现
业务层
业务层接口
业务层实现
持久层调用jdbc,业务层调用持久层,表现层调用业务层,会存在类相互依赖的情况,需要解耦
编译期依赖:没有某个类,不能正常编译
实际开发应做到,编译期不依赖,运行时依赖
spring的IOC容器是Map结构,一个id对应一个object
spring boot
参考笔记
注解只有一个属性,且属性名是value,则value可以不写
springboot
@SpringBootApplication
:Spring Boot Application的入口点是包含@SpringBootApplication
注释的类。@SpringBootApplication
批注添加到类中,则无需添加@EnableAutoConfiguration
,@ComponentScan
和@SpringBootConfiguration
spring
@Autowired
作用:自动按照类型注入,只要容器中有唯一的bean对象类型和要注入的变量类型匹配,就可以注入成功,在ioc容器中不考虑id,直接查找object的类名
出现位置:可以在变量上,也可以在方法上,
匹配过程:先寻找类名一致的,在类名一致的前提下,查看bean的id是否有和要注入变量的名字一样的,若有,则注入,否则报错。
@Bean
作用:用于把当前方法的返回值作为bean对象存入spring的ioc容器中,默认是单例的,
属性:
name:用于指定bean的id,默认值当前方法的名称
@Bean
@Scope('prototype')
private xxxx xxxx() {}
@Component
在持久层、业务层和控制层中,分别采用@Repository(持久层)、@Service(业务层)和@Controller(表现层)对分层中的类进行命名,而用@Component对那些比较中立的类进行命名。
作用:将当前类存放到spring容器中
属性:
value: 用于指定bean的id,默认类名(首字母变小写)
// 以下3中情况都相同
@Component(value='xxx')
@Component('xxx')
@Component
public class Xxx {}
@ComponentScan
作用:用于通过注解指定spring在创建容器时要扫描的包
属性:
value:等同于basePackages
basePackages:等同于value
@Component(value="xxx.xxx")
@Component("xxx.xxx")
@Configuration
作用:指定当前类是一个配置类
@Import
作用:允许从另一个配置类中加载 @Bean 定义
@Configuration
@Import(ConfigA.class)
@PostConstruct
作用:初始化执行方法,用于@Component之类的方法上
@PreDestroy
作用:销毁方法,多例spring不负责销毁方法,只有单例负责,用于@Component之类的方法上
@PropertySource
作用:用于指定properties文件的位置
@PropertySource("classpath:jdbc.properties")
属性:
value:指定文件的名称和路径
@Qualifier
作用:按照类型注入的基础上再按照名称注入,给类成员注入时不能单独使用,但是在给方法参数注入时可以。
属性:
value:用于指定bean的id
@Scope
作用:用于指定bean的作用范围
属性:
value:常用取值:singleton(单例) | prototype(多例) (默认单例)
@Value
作用:用于注入基本类型和String类型的数据
属性:
value:用于指定数据的值,也可以使用spring的el表达式
spring mvc
@RequestMapping
value
method
consumes
produces
params
headers
@RequestMapping("/test") // test 即为value值
@RequestMapping(value="/test/{id}", method=RequestMethon.GTET) // 处理动态URI
String getDynamicUriValue(@PathVariable String id) { // id值可以在这个得到
System.out.println("ID is " + id);
return "Dynamic URI parameter fetched";
}
@RequestMapping(method = RequestMethod.POST) // 处理所有post请求
@RequestMapping() // 处理所有请求
String default() {}
@RestController
@RequestMapping("/home") //单个属性可以省略value
public class IndexController {
@RequestMapping(value = "/prod", produces = {
"application/JSON"
}) // 返回消息是json类型
@ResponseBody
String getProduces() {
return "Produces attribute";
}
@RequestMapping(value = "/cons", consumes = {
"application/JSON",
"application/XML"
}) // 接受消息是json和xml类型,{} 指定多个消息头
String getConsumes() {
return "Consumes attribute";
}
}
@RequestParam
作用: 处理?key=value1&key2=value2
@RequestMapping("/user")
public String getUserBlog(@RequestParam("id") int blogId) {
return "blogId = " + blogId;
}
@RequestParam Map params
// 这样当我们访问/user?id=123时,Spring MVC帮助我们将Request参数id的值绑定到了处理函数的参数blogId上。这样就能够轻松获取用户输入,并根据它的值进行计算并返回了。
相信大家可能注意到了,@RequestParam
和@PathVariable
都能够完成类似的功能——因为本质上,它们都是用户的输入,只不过输入的部分不同,一个在URL路径部分,另一个在参数部分。要访问一篇博客文章,这两种URL设计都是可以的:
通过@PathVariable
,例如/blogs/1
通过@RequestParam
,例如blogs?blogId=1
那么究竟应该选择哪一种呢?建议:
当URL指向的是某一具体业务资源(或者资源列表),例如博客,用户时,使用@PathVariable
当URL需要对资源或者资源列表进行过滤,筛选时,用@RequestParam
例如我们会这样设计URL:
/blogs/{blogId}
/blogs?state=publish
而不是/blogs/state/publish
来表示处于发布状态的博客文章
更多用法
一旦我们在方法中定义了@RequestParam
变量,如果访问的URL中不带有相应的参数,就会抛出异常——这是显然的,Spring尝试帮我们进行绑定,然而没有成功。但有的时候,参数确实不一定永远都存在,这是我们可以通过定义required
属性:
@RequestParam(name="id",required=false) // 默认是true,也就是必须传这个参数
// 当然,在参数不存在的情况下,可能希望变量有一个默认值:
@RequestParam(name="id",required=false,defaultValue="0")
@RequestBody
如果把 json 作为参数传递,我们可以使用 @requestbody 接收参数,将数据转换 Map:
@PathVariable
是用来获得请求url中的动态参数的
@RequestHeader
@CookieValue
@ModelAttribute
@SessionAttribute
get
前台传的参数要和后台@RequestMapping绑定方法的参数名一致, 也可以将所有参数封装到一个对象account中,如果有嵌套user,前台的name要使用user.xxx