Spring的配置文件
(相关的XML文件编写)
在IOC思想解释中讲到,通过配置文件提供信息和类定义中有set方法来实现创建对象,并保存在ioc容器中.
编写方法:
1.创建普通maven项目
2.在src/main/java中创建你需要的类
3.在src/main/resources中创建一个xml文件
4.编写xml文件
- 添加xml版本和编码方式
<?xml version="1.0" encoding="UTF-8"?>
- 创建bean标签
<beans></beans>
- 规范bean标签
<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-4.0.xsd"></beans>
因为xml文档都有格式,为了spring的配置文件增加的节点能满足要求、合法,所以引入校验该xml的格式文件。
xmlns是xml命名空间的意思,而xmlns:xsi是指xml所遵守的标签规范。
1.xmlns:关于初始化bean的格式文件地址
2.xmlns:xsi:辅助初始化bean
3.xsi:context:关于spring上下文,包括加载资源文件
4.xsi:schemaLocation:用于声明了目标名称空间的模式文档 - 开始创建对象
第一种情况:普通创建对象
<bean id="对象名" class="对象类">
<property name="对象属性名" value="对象属性的值"/>
</bean>
第二种情况:如果你构建的类中有自动注入对象,那么需要在IOC容器中也创建要注入的bean
public class People {
@Autowired//不指定,默认注入同名对象
//要是里面的required="false"
private Cat cat;
@Autowired
@Qualifier(value = "dog2")//指定注入那个特定对象
private Dog dog;
private String name;
......
<context:annotation-config></context:annotation-config>
<!--开启扫描注解-->
<bean id="cat" class="com.cs.pojo.Cat"></bean>
<bean id="dog2" class="com.cs.pojo.Dog"></bean>
<bean id="dog22" class="com.cs.pojo.Dog"></bean>
<bean id="people" class="com.cs.pojo.People"></bean>
第三种情况:直接通过注解注入创建对象,你创建的类中的成员通过value注解注入属性具体值时:
@Component//将其
public class User {
@Value("注解实现")
public String name;
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
'}';
}
}
<!-- 指定要扫描的包,这个包下的注释就会生效-->
<context:component-scan base-package="com.cs.dao"/>
<context:annotation-config></context:annotation-config>
不通过XML文件提供信息创建对象
我们可以通过创建一个配置类来实现不用xml文件获取注入信息,步骤如下:
1.创建一个配置类
2.给配置类添加注解,让它的功能与xml文件相当
@Configuration //这个也会被spring注册到容器中,代表这是一个配置类
//配置类可以代替xml配置文件
@ComponentScan("com.cs.pojo")//扫描包下的组件,让我们写的组件生效
@Import(Config2.class)//将config2合并在一起
public class Config {
@Bean //在配置类中使用@bean注解相当于在xml文件中添加bean标签
//其中方法名就相当于xml文件的id,返回值相当于xml文件中的class
public User getUser(){
return new User();
}
}
创建对象后,如何从容器中获得对象
情况一:通过xml获得信息创建的对象
//spring通过beans.xml文件获得了创建对象的信息,然后创建对象放入context容器中
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
//通过context能够取到对象
Hello hello =(Hello)context.getBean("hello");
System.out.println(hello.toString());
情况二:通过配置类来代替xml的
//用配置类代替xml文件后要换方式获取容器
ApplicationContext context = new AnnotationConfigApplicationContext(Config.class);
User getUser = (User) context.getBean("getUser");
System.out.println(getUser.getName());
代理思想
目的:能够让真实执行的业务变得单一纯粹
原理:创建一个代理类实现真实类所需要做的各种事,然真实类变得功能单一纯粹.
AOP思想的实现步骤
以下三种方法均实现了在执行com.cs.service.UserServiceImpl.*全部方法时,之前和之后的具体导入.
导入对应的包:
<dependencies>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.4</version>
</dependency>
</dependencies>
实现用来切入的对象:
首先:
<!-- 开启注释支持-->
<aop:aspectj-autoproxy/>
方法一:使用spring提供的API
public class Log implements MethodBeforeAdvice {
@Override
public void before(Method method, Object[] args, Object target) throws Throwable {
System.out.println(target.getClass().getName()+"的"+method.getName()+"被执行了");
}
}
<aop:config>
<!--建立切入点-->
<aop:pointcut id="pointcut" expression="execution(* com.cs.service.UserServiceImpl.*(..))"/>
<!--在切入点执行类-->
<aop:advisor advice-ref="log" pointcut-ref="pointcut"/>
</aop:config>
方法二:使用自定义切入点实现
public class DiyPointCut {
public void before(){
System.out.println("+++++++++executeBefore+++");
}
public void after(){
System.out.println("+++++++++executeAfter+++");
}
}
<bean id="diy" class="com.cs.diy.DiyPointCut"/>
<aop:config>
<!-- 切入面-->
<!--diy包中的类DiyPointCut此时是个切入面-->
<aop:aspect ref="diy">
<!-- 切入点-->
<!-- 当* com.cs.service.UserServiceImpl.*(..)路径下的所有类执行时放置一个切入点-->
<aop:pointcut id="point" expression="execution(* com.cs.service.UserServiceImpl.*(..))"/>
<!-- 通知-->
<!--当执行到切入点时,执行通知方法,实现插入通知方法在代码中-->
<aop:before method="before" pointcut-ref="point"/>
<aop:after method="after" pointcut-ref="point"/>
</aop:aspect>
</aop:config>
方法三:使用注解实现
@Aspect
public class AnnotationPointCut {
@Before("execution(* com.cs.service.UserServiceImpl.*(..))")
public void before(){
System.out.println("+++++executeBefore+++++");
}
@After("execution(* com.cs.service.UserServiceImpl.*(..))")
public void after(){
System.out.println("+++++executeAfter+++++");
}
@Around("execution(* com.cs.service.UserServiceImpl.*(..))")
public void around(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println("Signature:"+joinPoint.getSignature());
System.out.println("++++++++++");
Object proceed = joinPoint.proceed();
System.out.println("----------");
}
}
<bean id="annotationPointCut" class="com.cs.diy.AnnotationPointCut"/>
Spring整合Mybatis
第一步:在ioc容器中注册好相关对象:
数据源对象,sqlSessionFactory对象,sqlSession对象,dao获取对象
<!-- DateSource:使用spring的数据源替代mybatis的配置 -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC&useSSL=false&useUnicode=true&characterEncoding=UTF-8"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</bean>
<!-- sqlSessionFactory-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<!-- 绑定mybatis配置文件-->
<property name="configLocation" value="classpath:mybatisConfig.xml"/>
<property name="mapperLocations" value="classpath:com/cs/mapper/UserMapper.xml"/>
</bean>
<!-- sqlSession-->
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
<!-- 使用构造器注入sqlSessionFactory 因为没有set方法-->
<constructor-arg index="0" ref="sqlSessionFactory"/>
</bean>
<bean id="userMapper" class="com.cs.mapper.UserMapperImpl">
<property name="sqlSessionTemplate" ref="sqlSession"/>
</bean>