Spring框架:
Spring是一个轻量级JavaEE开发框架,以Ioc和AOP为外围,在spring中,认为一切都是资源,而资源是类的实例化对象(Bean),包容并治理这些Bean的是spring提供的Ioc容器,所以spring是基于Bean的编程
长处:
非侵入式:指的是框架的API不会在业务逻辑上呈现,即业务逻辑是污浊的
容器:spring提供了容器性能,用于治理对象生命周期和对象之间的依赖关系,通过配置文件能够配置对象和依赖关系,到时候能够间接应用
Ioc:管制反转,依赖关系的转移,如果之前依赖于实现,那么当初依赖于形象,核心思想就是面向接口编程
依赖注入:对象之间依赖关系的实现,包含接口注入,结构注入,属性setter注入,spring中反对后两者
AOP:面向切面编程,网上各种讲解都有,笔者感觉大抵就是,在不改变原有代码的状况下,对指标进行性能加强和裁减,即在某点插入某面,点即原有性能代码,面即待裁减性能代码
spring次要蕴含了3大部分:Core container,Data Access/Integeration,Web
Core container:Beans,Core,Context,Spring EL
Data Access/Integeration:JDBC等
WEB:web,servlet,websocket
其余:AOP,Test等
Ioc/DI:
Spring的外围机制Ioc容器,用来削减组件之间的耦合度,在java中,调用者和被调用者存在依赖关系,通过new关键字实例化对象会导致两者耦合减少,不利于我的项目保护,在Spring框架中,创立和治理对象的工作不再由调用者执行,java培训而是交给框架施行,这样,管制权限由代码程序转移给了spring框架,控制权产生了反转
spring提倡面向接口编程,DI的外围就是:明确定义组件接口,独立开发各个组件,而后依据组件的依赖关系进行组装运行
注入类型:
构造方法注入:
条件:须要带参构造方法
//配置文件
<bean >
<constructor-arg name="name" value="小白"/>
<constructor-arg name="age" value="2"/>
</bean>
//性能代码
private static Cat cat;
public static void main(String[] args) {
ApplicationContext context=new ClassPathXmlApplicationContext("application.xml");
cat=context.getBean("cat",Cat.class);
System.out.println(cat.toString());
}
//输入
Cat{name='小白', age=2}
setter办法注入:
条件:须要指标有set办法和无参结构
<bean >
<property name="name" value="小红"/>
<property name="age" value="3"/>
</bean>
操作后果同上
p命名空间:
须要在文件头减少条目:
xmlns:p="http://www.springframework.org/schema/p"
//配置Bean
<bean p:name="小黑" p:age="4"/>
操作后果同上
Bean拆卸:
spring反对xml和properties两种形式的配置文件,罕用xml进行bean的创立和依赖治理,properties寄存动态属性;
xml配置文件的根标签就是beans,其内蕴含若干bean标签,用来定义一个bean并形容依赖关系和如何拆卸
bean蕴含以下属性(在bean标签内):
id:bean的惟一标识,拆卸时依据id获取对象
name:容器同样能够通过name实现对象配置和治理,能够指定多个,用逗号分隔
calss:具体实现类,全门路
scope:作用域,5种
bean子元素标签:
<constructor-arg>:结构注入实例化bean,上游index(属性序号),type(参数类型),ref/value(指定参数值)
<property>:调用bean中setter办法进行注入,实现属性赋值,name指定属性名,value/ref指定值
ref:注入援用其余bean
value:指定一个常量值
list,map,set,entry:指定bean的属性类型为对应类型的属性值
Bean作用域:
singleton:单例,仅定义一个bean对象
property:定义多个对象实例
request:一次Http申请,容器返回一个实例,仅作用于基于web的spring application context情景下无效
session:一次会话返回同一个bean实例,效劳同上
global session:在一个全局Http session会话中,返回同一个实例,仅实用protlet context无效
拆卸形式:
基于xml拆卸:
参照注入局部,这里笔者有些凌乱,感觉基于xml的注入和拆卸时一个操作两个概念
基于注解拆卸
@Service
class Test1 {
}
@Component
class Test2 {
}
@Controller
class Test3 {
}
@Qualifier()
@Controller
public class testOut {
@Value("#{spring.name}")
private String name;
@Value("#{Cat.id}")
private String id;
@Resource
private Test1 test1;
@Autowired
private Cat cat1;
private static Cat cat;
@RequestMapping(value = "/index.html",method = RequestMethod.POST)
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
cat = context.getBean("cat", Cat.class);
System.out.println(cat.toString());
}
}
spring中应用了一系列注解进行bean的拆卸,上面介绍一些常见的注解:
@Component
泛化概念,作用域任何档次,仅仅标识一个组件(bean),写在类上即可
@Repository
用于将数据拜访层(DAO)的类标识为spring中的bean,作用同上
@Service
通常作用于业务层,性能同上,将业务层类示意为bean
@Controller
通常作用于管制层(如spring mvc的controller),将管制层类标识为bean,作用同上
@Autowired
用于对bean的属性变量,属性的setter办法及构造方法进行标注配合相应的注解处理器实现bean的主动拆卸,默认依照bean类型拆卸,加上@Qualifier注解,能够间接指定一个bean实例名称进行拆卸
@Resource
作用相当于@Autowired,区别在于这里依照bean实例名称拆卸,蕴含name和type能够都不指定,这两个影响拆卸进行
@Qualifier(这一对注解临时不太会应用,仅做理解)
与@Autowired配合,默认依照类型拆卸,bean实例名称有该注解参数指定
@RequestMapping
为控制器指定能够解决哪些申请能够用在类或办法上,并且在办法上时能够定义反对哪些申请形式
以上作用相似xml拆卸,成果差不多
@Value
当某些定义值在配置文件加载后能够通过该标签获取,有两种形式
@Value("${配置文件中的属性字段}")
@Value("#{obj.property}")
@Value("#{spring.name}")//properties配置文件中额属性字段
@Value("#{Cat.name}")//bean Cat的name属性
<bean name="cat1,cat2" scope="prototype" autowire="byName">
主动拆卸:
在上述代码中,通过autowire="byName"定义了该bean的拆卸形式为依照名称主动拆卸
Spring MVC
该框架中,Controller代替了Servlet负担控制器的性能,Controller接管申请,调用相应的组件进行申请解决,解决实现后返回后果,Controller调用相应的View并对后果进行视图渲染,最终相应传送到客户端
该框架暂不做较多介绍,笔者目前仅处于会用阶段,等后续把握后再做探讨
Mybatis
反对一般SQL查问,存储过程和高级映射的长久层框架,封装了简直所有的JDBC代码和参数的手工设置以及后果集查问检索等,应用简略的xml或注解做配置和定义映射关系
须要配置:数据库属性(账户名,明码,url等),接口映射文件等
数据库动态属性文件:
database.properties:前4行为必须的,该文件通过第一个配置文件application进行加载
<context:property-placeholder location="classpath*:config/dev/database.properties"
ignore-unresolvable="false" ignore-resource-not-found="true"/>
dataSource.driverClassName=com.mysql.cj.jdbc.Driver
dataSource.url=jdbc:mysql://localhost:3306/sharetec?serverTimezone=Asia/Shanghai
dataSource.username=root
dataSource.password=admin001
dataSource.initialSize=10
dataSource.minIdle=10
dataSource.maxActive=200
database.xml:配置了数据库连贯属性
<bean init-method="init"
destroy-method="close">
<property name="driverClassName" value="${dataSource.driverClassName}"/>
<property name="url" value="${dataSource.url}"/>
<property name="username" value="${dataSource.username}"/>
<property name="password" value="${dataSource.password}"/>
</bean>
<bean >
<property name="dataSource" ref="dataSource"/>
<property name="configLocation" value="classpath:mybatis/config/mybatisConfig.xml"/>
</bean>
spring-mapper.xml配置了mapper接口bean对象,并引入数据库配置文件
<!--映射mspper接口-->
<bean >
<property name="mapperInterface" value="com.shareTec.mapper.UserInfoMapper"/>
<property name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>
<!--映射mybatis的sql配置文件-->
<import resource="spring-database.xml"/>
mybatisConfig.xml配置用到的bean对象别名和设置sql的配置文件门路
<configuration>
<!--配置bean别名和mapper-->
<typeAliases>
<typeAlias alias="userInfo" type="com.shareTec.bean.UserInfo"/>
<package name="com.shareTec.bean"/>
</typeAliases>
<mappers>
<mapper resource="mybatis/UserInfoMapper.xml"/>
</mappers>
</configuration>
ObjectMapper.xml 在该文件书写sql代码
<insert parameterType="userInfo">
insert into userinfos
(userId,username,password,cardId,state)
values
(#{userId},#{username},#{password},#{cardId},#{state})
</insert>
通过以上配置文件能够实现java代码和数据库的互操作
SQL进阶
sql一般的增删改查语句
insert into userinfo (列) values (值);
delete from 表名 where 字段条件
drop table 表名truncate table 表名
update 表名 set (字段=值) where (条件)
select (字段) from 表名 where 条件
在理论中可能场景比较复杂,这是后应用动静SQL技术会比拟适宜(前提是纯熟应用,笔者目前不算特地纯熟,只能大略应用)
insert个别不应用(或者笔者接触面比拟窄,能想到几种场景,然而感觉没必要,能够间接在数据库设置字段属性也能达到相应目标)
我的项目中个别不对数据库进行删除操作,通常应用状态字段标识数据有效性(比方00,01等)
改,又叫更新:
<update parameterType="userinfo">
update userinfos
<set>
<if test="username!=null">
username=#{username},
</if>
</set>
<choose>
<when test="userId!=null">
userId=#{userId}
</when>
<otherwise>
cardId=#{cardId}
</otherwise>
</choose>
</update>
上述代码实现了字段判断和条件抉择更新,用到了<choose>,<if>,<when>,<otherwise>标签
<select resultType="userinfo">
select * from userinfos where userId in
<foreach collection="list" item="users" open="(" close=")" separator=",">
{users}
</foreach>
</select>
上述代码实现了遍历汇合查问,应用了<foreach>标签进行汇合设置,主要参数:
collection:汇合性质,能够是list或者array
item:每个汇合元素迭代时的别名,如果元素是值,则该属性可代替本字段,如果是援用对象,则能够代替以后迭代对象,能够应用相似users.getName这种语法获取属性,open和close代表以什么结尾和结尾,separator,示意以什么做分隔符