1.Spring是为了解决企业级应用开发的复杂性而创建的
2.Ioc概念:Ioc的中文叫控制反转,控制反转实际上就是指对一个对象控制权的反转。 3. Bean的获取:使用ClassPathXmlApplicationContext类去获取当前路径下的xml配置文件,再调用该类的getBean方法获取对象。
public class Main {
public static void main(String[] args) {
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
Book book = ctx.getBean(Book.class);
System.out.println(book);
}
}
方法的参数可以通过Class或者id去获取,如果通过Class去获取且xml文件中有两个Bean的话会报错,所以推荐使用id。
4.属性注入:再XML配置中属性注入有多种方式
- 构造方法注入
- set方法注入
- p名称空间注入
- 外部Bean的注入(静态工厂注入、实例工厂注入)
5.复杂属性的注入
-
对象注入:通过 ref 来引用一个对象 <bean class="org.javaboy.User" id="user">
<property name="cat" ref="cat"/>
</bean>
-
数组注入:数组注入和集合注入在xml中配置相同 <bean class="org.javaboy.User" id="user">
<property name="cat" ref="cat"/>
<property name="favorites">
<array>
<value>足球</value>
<value>篮球</value>
<value>乒乓球</value>
</array>
</property>
</bean>
-
Map注入 <property name="map">
<map>
<entry key="age" value="99"/>
<entry key="name" value="javaboy"/>
</map>
</property>```
-
Properties注入 <property name="info">
<props>
<prop key="age">99</prop>
<prop key="name">javaboy</prop>
</props>
</property>
6.在Spring中,想要将一个Bean注册到Spring容器中,有三种不同的方式
- XML注入
- Java配置(通过Java代码将Bean注册到Spring容器中)
- 自动化扫描
7.自动化配置:自动化配置可以通过Java配置来实现,也可以通过xml配置来实现
-
一个类要添加注解注册到Spring容器中,才能够实现自动扫描,自动扫描的方式有两种,一种是通过Java代码配置自动化扫描,另一种是通过xml文件 -
Java代码配置自动扫描 @Configuration
@ComponentScan(basePackages = "org.javaboy.javaconfig.service")
public class JavaConfig {
}
@ComponentScan注解指定要扫描的包 -
XML配置自动化扫描 <context:component-scan base-package="org.javaboy.javaconfig"/>
-
对象注入 自动扫描时的对象注入有三种方式: 1.@Autowired 2.@Resources 3.@Injected
@Autowired是根据类型去查找,如何赋值,但要求这个类型只可以有一个对象,不然会报错。 @Resources是根据名称去查找,允许一个可以存在多个实例。 @Qualifier 和 @Autowired一起使用可以实现通过变量名查找到变量,@Qualifier 可以指定变量名
8.Aop(Aspect Oriented Programming),面向切面编程,对面向对象思想的补充。面向切面编程是指程序运行时,不改变源码的情况下动态增强方法的功能。
Aop几个常见的概念:
概念 | 说明 |
---|
切点 | 添加代码的地方 | 通知 | 向切点动态添加代码 | 切面 | 切点+通知 | 连接点 | 切点的定义 |
Aop的实现 Aop是基于Java动态代理来实现的。 Java的动态代理有两种实现方式:
9.五种通知 Spring中的Aop通知类型有5种:
10.JdbcTemplate:JdbcTemplate是Spring 利用Aop思想封装的JDBC操作工具
@Configuration
public class JdbcConfig {
@Bean
DataSource dataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
dataSource.setUsername("root");
dataSource.setPassword("123");
dataSource.setUrl("jdbc:mysql:///test01");
return dataSource;
}
@Bean
JdbcTemplate jdbcTemplate() {
return new JdbcTemplate(dataSource());
}
}
<bean class="org.springframework.jdbc.datasource.DriverManagerDataSource" id="dataSource">
<property name="username" value="root"/>
<property name="password" value="123"/>
<property name="url" value="jdbc:mysql:///test01?serverTimezone=Asia/Shanghai"/>
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
</bean>
<bean class="org.springframework.jdbc.core.JdbcTemplate" id="jdbcTemplate">
<property name="dataSource" ref="dataSource"/>
</bean>
11.事务:Spring中的事务主要是利用Aop思想,简化事务的配置,可以通过Java配置实现也可以通过XML配置。
- XML配置:XML中配置事务分为三个步骤
1.配置TransactionManager
<bean class="org.springframework.jdbc.datasource.DataSourceTransactionManager" id="transactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
2.配置事务要处理的方法
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="update*"/>
<tx:method name="insert*"/>
<tx:method name="add*"/>
<tx:method name="delete*"/>
</tx:attributes>
</tx:advice>
注:一旦配置了方法的名称规则之后,service中的方法要按照这里的名称规则来,否则事务配置不会生效 3.配置Aop
<aop:config>
<aop:pointcut id="pc1" expression="execution(* org.javaboy.service.*.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="pc1"/>
</aop:config>
- Java配置
要开启Java注解配置,要在XML配置中添加以下配置
<tx:annotation-driven transaction-manager="transactionManager" />
这个配置可以替代下面两个配置
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="update*"/>
<tx:method name="insert*"/>
<tx:method name="add*"/>
<tx:method name="delete*"/>
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="pc1" expression="execution(* org.javaboy.service.*.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="pc1"/>
</aop:config>
然后在需要添加事务的方法上,添加@Transactional注解,表示开启该方法的事务,注解也可以放在类上,表示这个类中的所有方法都开启事务
@Service
public class UserService {
@Autowired
UserDao userDao;
@Transactional
public void updateMoney() {
userDao.addMoney("zhangsan", 200);
int i = 1 / 0;
userDao.minMoney("lisi", 200);
}
}
|